Pra*_*ari 1 c++ iterator vector c++-standard-library c++11
我有两个代码示例,它们完全相同.一个是C++ 03和C++ 11.
C++ 11
int main()
{
vector<int> v = {1,2,3};
int count = 0;
for each (auto it in v)
{
cout << it<<endl;
if (count == 0)
{
count++;
v.push_back(4);//adding value to vector
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C++ 03
int main()
{
vector<int> v = {1,2,3};
int count = 0;
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it<<endl;
if (count == 0)
{
count++;
v.push_back(4);//adding value to vector
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这两个代码都给出以下例外.
现在,当我看到vector :: end()实现时,
iterator end() _NOEXCEPT
{
// return iterator for end of mutable sequence
return (iterator(this->_Mylast, this));
}
Run Code Online (Sandbox Code Playgroud)
这里,内联函数显然需要_Mylast
计算结束.所以,当我添加时,它的指针会增加到下一个位置,就像_Mylast++
.为什么我得到这个例外?
谢谢.
ten*_*our 10
向量将其元素存储在连续的内存中.如果需要重新分配该内存块,则迭代器将变为无效.
如果需要在迭代时修改向量的大小,请按索引而不是迭代iterator
.
另一种选择是使用具有不同迭代器行为的不同容器,例如,list
允许您在插入项时继续迭代.
最后,(我敢建议吗?)如果你知道你的矢量将增长到的最大尺寸,.reserve()
那么在迭代它之前.这将确保在循环期间不会重新分配.我不确定这种行为是否由标准保证(也许有人可以插入); 我绝对不会这样做,考虑通过索引进行迭代是非常安全的.