std::copy 失败,"cannot seek vector iterator after end"

std::copy failure, "cannot seek vector iterator after end"

我整理了这个测试用例,它重现了我在更大的代码中遇到的情况和问题。事实上,我确实需要从 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);
}

断言 "cannot seek vector iterator after end" 似乎发生在 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());

或者只是

std::vector<W> dest(1);
std::copy(block, block+1, dest.begin());

或使用std::back_inserter to get an std::back_insert_iterator.

The container's push_back() member function is called whenever the iterator (whether dereferenced or not) is assigned to.

std::vector<W> dest;
dest.reserve(1);
std::copy(block, block+1, std::back_inserter(dest));