今天在使用std::vector.erase()这个库方法时,发现运行结果与自己预想的不一样。
vector<double> vec = {1.0,1.2,1.3,2.0,2.0,3.0,3.0,5.5};
for(int i=0;i<vec.size();i++){
if(vec[i]==vec[i+1]){
vec.erase(vec.begin()+i);
i--;
}
}
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<"\n";
}
输出结果为:
1
1.2
1.3
2
3
比我预想的结果少输出了一个5.5;
debug了一下,发现vector.erase()虽然能够删除vector中的元素,也能够让vector.size()-1,但是它每次删除一个元素,只是让vector中的该元素往后的所有元素往前移一个位置,而vector最后的位置(上述程序中的vec[7])依旧存储着5.5。所以当程序删除两个元素(2.0 , 3.0 )之后,执行到i=5时,vec[5]和vec[6]都是5.5,所以程序又执行了一次vec[i].erase(),导致最终程序没有输出5.5.
换个例子,更清楚:
vector<double> vec = {1.0,1.2,1.3,2.0,2.0,3.0,3.0,5.5};
vec.erase(vec.begin());
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<"\n";
}
cout<<"======"<<endl;
cout<<"vec[6]:"<<vec[6]<<endl;
cout<<"vec[7]:"<<vec[7]<<endl;
vec一共8个元素,使用erase()删除第一个元素后,程序执行结果如下:
1.2
1.3
2
2
3
3
5.5
======
vec[6]:5.5
vec[7]:5.5
可以看到删除一个元素之后,vec[7]依旧有值。