有关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]依旧有值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
std::array和std::vector都是C++中的容器,用于存储和管理一系列的元素。它们有一些相似之处,但也有一些不同之处。 1. std::array: std::array是一个固定大小的数组,它在编译时就确定了大小。它的大小是固定的,不能动态改变。std::array的元素在内存中是连续存储的,可以通过索引访问元素。以下是std::array的一些常用操作[^1]: - 创建一个空的std::array对象:std::array<T, N> arr; - 获取std::array的大小:arr.size(); - 访问std::array中的元素:arr[i]或arr.at(i); - 清空std::array中的所有元素:arr.fill(value); 2. std::vectorstd::vector是一个动态数组,它的大小可以在运行时动态改变。std::vector的元素在内存中也是连续存储的,可以通过索引访问元素。以下是std::vector的一些常用操作: - 创建一个空的std::vector对象:std::vector<T> vec; - 创建一个指定大小的std::vector对象:std::vector<T> vec(n); - 在std::vector的末尾添加元素:vec.push_back(value); - 获取std::vector的大小:vec.size(); - 清空std::vector中的所有元素:vec.clear(); - 删除std::vector中的最后一个元素:vec.pop_back(); - 删除std::vector中的指定元素:vec.erase(vec.begin() + i); - 迭代访问std::vector中的元素:for (auto it = vec.begin(); it != vec.end(); ++it) { ... } std::array适用于大小固定且不需要频繁创建销毁的情况,而std::vector适用于大小不确定且需要频繁创建销毁的情况。在性能方面,std::array在大部分情况下与std::vector相比没有明显的差距。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值