为什么在使用迭代器时添加到向量不起作用?

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()那么在迭代它之前.这将确保在循环期间不会重新分配.我不确定这种行为是否由标准保证(也许有人可以插入); 我绝对不会这样做,考虑通过索引进行迭代是非常安全的.