2011-09-09 5 views
6

ファイルストリームからNバイトのデータを読み込み、ベクトルに追加します。ファイルからNバイトを読み込んでstd :: vectorに追加します。

myBuffer.reserve(N); 
for (int i=0; i<N; ++i) 
{ 
    uint8_t tmpByte; 
    myFileStream.read(&tmpByte, 1); 
    myBuffer.push_back(tmpByte); 
} 

が、これは非常に遅いです:それでは、私たちは

basic_ifstream<uint8_t> myFileStream; 

vector<uint8_t> myBuffer; 

現在、私はこのような何かをやっているを持っているとしましょう。

今私はmyFileStream.readにベクトルに直接データをコピーさせようとしました。ベクトルは、連続した保管場所でその要素を格納しているので、私はこのようなものが可能であることを考えた:

uint8_t* ptr = &myBuffer.back(); // there is already some elements in the buffer (I know) 
ptr++; // first element after existing data 
myBuffer.resize(myBuffer.size() + N); 
myFileStream.read(ptr, N); 

しかし、これで私は、ランタイムエラー(ヒープの破損)を取得します。このソリューションで何が問題になっていますか?とにかくこれを行うには良い方法がありますか?

答えて

12

あなたの問題は、resizeが全体のベクトルを再割り当てする必要があり、以前のptrを無効にする必要があるということです。 resizeの後にだけポインタを取る必要があります。ボーナスとして、この実装は元のベクトルは(N != 0ため、当然の)空の場合でも動作すること

std::size_t oldSize = myBuffer.size(); 
// resize first 
myBuffer.resize(oldSize + N); 
uint8_t* ptr = &myBuffer[oldSize]; // already first element after existing data 
myFileStream.read(ptr, N); 

は注意してください。

+0

今は動作します:)あなたの助けをありがとう! –

+4

@Ajeet: 'reserve()'はコンテナの 'size()'を変更しません。パフォーマンスに対する正確さを評価します。 –

+0

真。 push_back()を使用していた場合にのみ便利です。私のコメントを削除する。ありがとう@ R。マルティニョ –

関連する問題