我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从POD结构的C数组中进行复制,但是我希望将目标作为向量,以便它可以自行处理复制删除。
TEST_METHOD(std_copy)
{
struct W { long a; int b; char c; char d; };
W block[1] = { { 15, 42, 'D', 'X' } };
std::vector<W> dest;
dest.reserve(1);
std::copy(block, block+1, dest.begin());
Assert::AreEqual(42, dest[0].b);
}
Run Code Online (Sandbox Code Playgroud)
断言似乎是在dest.begin()调用内发生的,“在结束后不能寻求向量迭代器” ,这对我来说没有任何意义。我确定我只是缺少一个明显的细节,但这是什么?
如错误消息所述,您已经超出了向量的范围。
给定std::copy(block, block+1, dest.begin());,dest应该包含至少相同数量的元素(即此处一个元素),但实际上是空的。
您可以使用resize替代reserve,
std::vector<W> dest;
dest.resize(1);
std::copy(block, block+1, dest.begin());
Run Code Online (Sandbox Code Playgroud)
要不就
std::vector<W> dest(1);
std::copy(block, block+1, dest.begin());
Run Code Online (Sandbox Code Playgroud)
或用于std::back_inserter获取std::back_insert_iterator。
push_back()每当分配迭代器(无论是否取消引用)时,都会调用容器的成员函数。
std::vector<W> dest;
dest.reserve(1);
std::copy(block, block+1, std::back_inserter(dest));
Run Code Online (Sandbox Code Playgroud)