问题 为什么我得到“矢量迭代器不兼容”?


为什么这个代码

#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)?


6843
2018-04-06 20:24


起源



答案:


对应于元素的迭代器仅在必须重新分配向量时失效 reserve 避免。

然而, v.end() 不会保持有效。

标准的描述 push_back 和 insert 保证

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

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


14
2018-04-06 20:26



+1 Dang ......这太烦人了。什么是最好的解决方法? - Mehrdad
一个 for 循环操作索引? - Ben Voigt
@Mehrdad,我没想到 insert 避免这种混乱? - chris
@chris:不,它用同一种语言描述,插入点处或之后的迭代器变得无效。 - Ben Voigt
@BenVoigt:对不起,我的意思是使用迭代器解决方法......这只是一个展示问题的例子; for 带索引的循环不能很好地概括为其他容器。 :( - Mehrdad


答案:


对应于元素的迭代器仅在必须重新分配向量时失效 reserve 避免。

然而, v.end() 不会保持有效。

标准的描述 push_back 和 insert 保证

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

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


14
2018-04-06 20:26



+1 Dang ......这太烦人了。什么是最好的解决方法? - Mehrdad
一个 for 循环操作索引? - Ben Voigt
@Mehrdad,我没想到 insert 避免这种混乱? - chris
@chris:不,它用同一种语言描述,插入点处或之后的迭代器变得无效。 - Ben Voigt
@BenVoigt:对不起,我的意思是使用迭代器解决方法......这只是一个展示问题的例子; for 带索引的循环不能很好地概括为其他容器。 :( - Mehrdad