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

问题描述:

为什么这个代码为什么我得到“矢量迭代器不兼容”?

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

当元素必须被重新分配时,元素对应的迭代器才会失效,这个reserve可以避免。

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

push_backinsert保障标准的描述是

导致重新分配,如果新的尺寸比旧款更大的容量。如果没有重新分配, 插入点之前的所有迭代器和引用保持有效。

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

+2

+1 D ...这太讨厌了。什么是最好的解决方法? – Mehrdad 2013-04-06 20:29:05

+0

在索引上运行'for'循环? – 2013-04-06 20:30:37

+0

@Mehrdad,我不认为'insert'可以避免这个混乱? – chris 2013-04-06 20:30:43