#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
,但我收到的输出如下所示:
答案 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;
}
如您所见,开始和结束迭代器完全改变