簡體   English   中英

std :: copy失敗,“無法在結束后尋找向量迭代器”

[英]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);
}

斷言“無法在結束后尋找向量迭代器”似乎發生在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獲取std::back_insert_iterator

只要分配了迭代器(無論是否取消引用),就會調用容器的push_back()成員函數。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM