我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从C数组的POD结构中进行复制,但是我希望将目标作为向量,以便它可以自行处理复制删除。
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);
}
在dest.begin()
调用中似乎出现了断言“结束后无法寻求矢量迭代器”,这对我来说毫无意义。我确定我只是缺少一个明显的细节,但这是什么?
答案 0 :(得分:0)
如错误消息所述,您已经超出了向量的范围。
假设std::copy(block, block+1, dest.begin());
,dest
至少包含相同数量的元素(即此处为一个元素),但实际上是空的。
您可以使用resize
代替reserve
,
std::vector<W> dest;
dest.resize(1);
std::copy(block, block+1, dest.begin());
或者只是
std::vector<W> dest(1);
std::copy(block, block+1, dest.begin());
或使用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));