为什么这段代码
#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;
}
给我调试断言失败, Expression:vector iterators incompatible (Visual C ++ 2008)?
答案 0 :(得分:14)
与元素对应的迭代器仅在必须重新分配向量时失效,reserve
避免使用。
但是,v.end()
不会保持有效。
标准对push_back
和insert
的描述保证了
如果新大小大于旧容量,则会导致重新分配。如果没有重新分配, 插入点之前的所有迭代器和引用都保持有效。
v.end()
不是“在插入点之前”。