有关std::vector.erase()

今天在使用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]依旧有值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值