std :: copy失败,“结束后无法寻找向量迭代器”

Mik*_*e C 5 c++ stdvector

我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从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()调用内发生的,“在结束后不能寻求向量迭代器” ,这对我来说没有任何意义。我确定我只是缺少一个明显的细节,但这是什么?

son*_*yao 6

如错误消息所述,您已经超出了向量的范围。

给定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)

  • 或简单地从`block`中构造`dest`,例如:`std :: vector &lt;W&gt; dest {std :: begin(block),std :: end(block)};` (6认同)