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

时间:2019-06-02 05:08:29

标签: c++ stdvector

我把这个测试用例放在一起,用大代码重现了条件和问题。实际上,我确实需要从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()调用中似乎出现了断言“结束后无法寻求矢量迭代器”,这对我来说毫无意义。我确定我只是缺少一个明显的细节,但这是什么?

1 个答案:

答案 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));