c ++ std :: copy输入迭代器(指针)到vector

时间:2013-01-14 17:41:48

标签: c++ vector iterator copy std

您好我正在尝试理解为什么以下代码不起作用。我正在尝试使用指针作为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());
上面的std :: copy()调用

file.data.size()为零。

要将数据导入vector file.data,我目前手动复制:

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

为什么使用两个指针作为输入迭代器似乎不起作用?

编辑:澄清我的意思是没有数据实际上被复制到file.mBinaryData向量中。

2 个答案:

答案 0 :(得分:4)

使用std::vector,您必须使用std::back_inserter。如果没有它,迭代器将不会执行push_back来复制数据,而只是递增给定的迭代器。

std::copy(fsRead.Buffer, fsRead.Buffer + fsRead.BufferSize, std::back_inserter(file.data));

答案 1 :(得分:3)

这会失败,因为访问向量的迭代器永远不会改变向量的大小。

您可以使用其中一个标准迭代器适配器(例如back_inserter)来执行此操作。这看起来像这样:

// Looks like you really wanted copy_n instead...
std::copy_n(fsRead.Buffer, fsRead.BufferSize, std::back_inserter(file.data));