1

私が知っていることから、ベクトルは連続的であることが保証されており、それにメモリのチャンクを書き込んで fwrite を送信できます。私がする必要があるのは、.resize() を呼び出して、必要な最小長になるように強制することだけです。その後、通常の char 配列として使用できますか? このコードは正しいでしょうか

v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back
vector<char>v2;
v2.resize(numOfElements*SizeOfType);
while(...)
{
...
v.push_bacK(x); 
}
compress(&v2[0], len, &v[0], len);
fwrite(&v2[0], ....)

私はv2を押し戻したりポップしたりしないことに注意してください。一度だけサイズを変更し、char配列として使用しました。これは安全でしょうか?また、安全なvもダンプした場合(プッシュバックしてクリアします。テストのためにダンプする場合があります)

4

5 に答える 5

4
v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back

上記のコード スニペットは、事実上、要素を割り当てて作成し、それらを再び破棄するだけです。実際には次と同じです。

v.reserve(numOfElements);

このコードの方がはるかに高速です。したがって、v.size() == 0どちらの場合も と は両方の場合とv.capacity() 同じである可能性があり numOfElementsます (ただし、これは保証されていません)。ただし、2 番目のケースでは、容量は少なくとも numOfElements です。これは、その多くの要素をベクターに push_back するまで、内部バッファーが再割り当てされないことを意味します。どちらの場合も、実際に要素が含まれていないため、要素にアクセスしようとすると無効になることに注意してください。

それとは別に、私はあなたのコードに問題を見つけていません。newそれは安全であり、生の代わりに、またはmallocそれが提供する安全性が追加されているため、それを使用することをお勧めします. ただし、「ダンプv」の意味がわかりません。

于 2009-01-28T20:22:57.313 に答える
2

このようなもののために、私は個人的にSTLSoftのようなクラスを使用しますauto_buffer<>

免責事項として-私は実際のSTLSoftライブラリのバージョンを使用せず、非常によく似た独自のテンプレートを採用しました-私はMatthew Wilson(STLSoftの作者)の本「ImperfectC++」から始めました。

昔ながらのC配列が本当に必要な場合に便利ですが、実行時にサイズを動的にする必要があります。auto_buffer<>単純な古い配列よりも安全ですが、一度構築すると、要素がいくつあるかどうかについて心配する必要はありません。配列と同じように、常に構築したものと同じです(したがって、配列よりも少し複雑ではありませんvector<>)。時々適切です)。

の主な欠点auto_buffer<>は、標準ではなく、Boostにも含まれていないことです。そのため、STLSoftの一部をプロジェクトに組み込むか、独自のバージョンを作成する必要があります。

于 2009-01-28T21:08:27.657 に答える
2

実際、C 配列とのレイアウト互換性を保つために、std::vector は連続していることが保証されています。ただし、ベクターの多くの操作では、その要素を指すすべてのポインターが無効になることに注意する必要があります。そのため、1 つのタイプの使用に固執することをお勧めします。ポインター演算とベクターでのメソッド呼び出しを混在させないでください。

それ以外は、最初の行を除いて完全に正しいです:あなたが望むのは

v.reserve(numOfElements);

numOfElementsベクトルに格納するのに十分な場所を割り当てますが、

v.resize(numOfElements);

次のことを行います。

// pseudo-code
if (v.size() < numOfElements)
    insert (numOfElements - size) elements default 
    constructed at the end of the vector

if (v.size() > numOfElements)
    erase the last elements so that size = numOfElements

要約すると、a の後、reserveベクトル容量が numOfElements 以上であるresizeことを確認し、a の後、ベクトルサイズが numOfElements と等しいことを確認します。

于 2009-01-28T20:31:45.390 に答える
0

はい、生の入力を読み取るためのバッファとして char のベクトルを使用します。

// dynamically allocates a buffer of 10,000 char as buffer
std::vector<char>   data(10000);

fread(&data[0], sizeof(char),data.size(),fp);

ただし、POD 以外のデータ型をベクトルに直接読み込むためには使用しません。

ベクターを書き込みのソースとして使用できる可能性があります。
しかし、私はあなたがそれを読み返す方法に非常に注意を払います (シリアル化する方が簡単かもしれません)。

fwrite(&data[0], sizeof(char),data.size(),fp);
于 2009-01-28T20:42:08.677 に答える
0

reserve() を resize に置き換えています。置き換えることもできます

vector<char> v2

vector<Type> v2

これにより、コードが少し簡素化されます。

率直に言って、これは私が今まで見た中で最も奇妙なベクトルの使い方ですが、おそらくうまくいくでしょう。new char[size] とブーストからのある種の自動ポインターを使いたくないですか?

于 2009-01-28T20:42:38.723 に答える