为什么这里的矢量内容打印错了?

时间:2017-09-13 20:39:09

标签: c++ c++11 vector

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    int test=0;
    vector<int>v{1,2,3};
    for(auto i=v.cbegin();i!=v.cend();++i)
    {
        ++test;
        if(test==2)
        {
            v.push_back(4);
        }
        cout<<*i<<endl;
    }
    return 0;
}

我希望输出只有1 2 3 4,但我收到的输出如下所示:

image

1 个答案:

答案 0 :(得分:3)

如果新项目不适合矢量容量(内部大小),则push_back可以更改开始和结束迭代器。在您的示例中,push_back意味着重新分配内部缓冲区,并且开始和结束迭代器获取新值。您的示例中的问题是将为每个步骤评估end-iterator并获取新值,但begin Iterator仍保留旧的(无效)值并导致未定义的行为。 以下更改将说明会发生什么:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
    int test=0;
    vector<int>v{1,2,3};
    for(auto i=v.cbegin();i!=v.cend();++i)
    {
        ++test;
        if(test==2)
        {
            std::cout << &*v.cbegin()<<std::endl;
            std::cout << &*v.cend()<<std::endl;
            v.push_back(4);
            std::cout << &*v.cbegin()<<std::endl;
            std::cout << &*v.cend()<<std::endl;
        }
        cout<<*i<<endl;
    }
    return 0;
}

如您所见,开始和结束迭代器完全改变

show result