2013-04-06 54 views
11

爲什麼這個代碼爲什麼我得到「矢量迭代器不兼容」?

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

回答

14

當元素必須被重新分配時,元素對應的迭代器纔會失效,這個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

相關問題