0

こんにちは、次のコードが機能しない理由を理解しようとしています。std::copy アルゴリズムへの入力イテレータ型としてポインタを使用しようとしています。fsRead.Buffer はコピーするデータの先頭を指し、fsRead.BufferSize はコピーするデータのサイズです。

// AllocateZeroPool(UINT64) takes an input size, and returns a pointer to allocated memory. (this is the existing C api)
fsRead.Buffer = static_cast<UINT8*>(AllocateZeroPool(fsRead.BufferSize));
//
// this next line populates the data into fsRead.Buffer
auto status = mFs->read_data(nullptr, &fsRead);

the type of file.data is: std::vector<UINT8>
std::copy(fsRead.Buffer, fsRead.Buffer + fsRead.BufferSize, file.data.begin());

file.data.size() は、上記の std::copy() 呼び出しでゼロです。

ベクター file.data にデータを取得するために、現在、手動でコピーを行っています。

for(auto i(0U); i < fsRead.BufferSize; ++i) {
    file.mBinaryData.emplace_back(fsRead.Buffer[i]);
}

入力反復子として 2 つのポインターを使用しても機能しないように見えるのはなぜですか?

編集:明確にするために、実際にはデータが file.mBinaryData ベクトルにコピーされないことを意味します。

4

2 に答える 2

4

を使用std::vectorする必要がありますstd::back_inserter。これがないと、イテレータはpush_backデータをコピーするために a を実行せず、指定されたイテレータをインクリメントするだけです。

std::copy(fsRead.Buffer, fsRead.Buffer + fsRead.BufferSize, std::back_inserter(file.data));
于 2013-01-14T17:45:25.213 に答える
3

ベクトルへの反復子へのアクセスはベクトルのサイズを決して変更しないため、これは失敗します。

代わりに、 などの標準イテレータ アダプタの 1 つを使用してback_inserter、これを行うことができます。それは次のようになります。

// Looks like you really wanted copy_n instead...
std::copy_n(fsRead.Buffer, fsRead.BufferSize, std::back_inserter(file.data));
于 2013-01-14T17:45:41.420 に答える