【问题标题】:Why am I getting "vector iterators incompatible"?为什么我得到“向量迭代器不兼容”?
【发布时间】:2013-03-29 03:35:41
【问题描述】:

为什么会有这段代码

#include <algorithm>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.reserve(v.size() * 2);  // Reserve enough space to keep iterators valid
    std::copy(v.begin(), v.end(), std::back_inserter(v));
    return 0;
}

给我调试断言失败,表达式:向量迭代器不兼容(Visual C++ 2008)?

【问题讨论】:

    标签: c++ visual-studio-2008 visual-c++ vector iterator


    【解决方案1】:

    与元素对应的迭代器仅在必须重新分配向量时才会失效,reserve 避免了这种情况。

    但是,v.end() 不会保持有效。

    标准对push_backinsert 的描述保证

    如果新大小大于旧容量,则会导致重新分配。如果没有发生重新分配, 插入点之前的所有迭代器和引用都保持有效。

    v.end() 不是“插入点之前”。

    【讨论】:

    • +1 Dang... 这太烦人了。最好的解决方法是什么?
    • 一个for循环在索引上运行?
    • @Mehrdad,我不认为insert 会避免这种混乱?
    • @chris:不,它是用同一种语言描述的,插入点处或之后的迭代器会失效。
    • @BenVoigt:对不起,我的意思是使用迭代器的解决方法……这只是一个说明问题的例子; for 带有索引的循环不能很好地推广到其他容器。 :(
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2017-02-07
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多