文档章节

vector的erase操作

刘大神
 刘大神
发布于 2016/09/07 09:21
字数 489
阅读 714
收藏 5

    最近,在看书的时候,偶然间发现一个细节:就是vector的erase操作。对于这个erase操作,大家都清楚,这个删除操作有2种形式,(1)删除单个元素,参数是迭代器变量;(2)删除区间元素,参数是begin和end。而细节就是在删除单个元素的时候,发生的具体事情。

    例如:有一个vector,是这样初始化的,vector<int> va{0,1,2,2,3,4,5},删除掉vector中 元素等于2的!

通常代码是这样写的:

#include <vector>
 #include <iostream>

int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     std::vector<int> vb(va);     for (auto i = va.begin();i != va.end(); i++)     {         if (*i == 4)         {             i = va.erase(i);         }     }     for (auto i : va) { std::cout << i << "  "; }     return 0; }

乍一看并无不妥之处,然而结果却出乎意料

image

为什么结果会是这样呢?仔细想想了,原来是在删除的地方出了错误,当if条件成立之后,vector进行删除操作,删除掉vector中符合条件的元素,重点来了,当vecotr执行erase操作的之后,返回的值表示当前被删除迭代器的下一位置,注意,是下一个位置,然后,当再次循环的是,迭代器又向后移动了一个位置,导致接下来相同的元素并没有被删除。

附上正确写法:

#include <vector> #include <iostream>

int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     std::vector<int> vb(va);     auto iter = vb.begin();     while(iter!=vb.end())     {         if (iter != vb.end())         {             if (*iter == 4)             {                 iter = vb.erase(iter);             }             else 
            { iter++; }         }     }     for (auto j : vb)     {         std::cout << j << "  ";     }     return 0; }
#include <vector>  #include <iostream>


int main() {     std::vector<int> va{ 1,2,3,4,4,5,6 };     for (auto i = va.begin();i != va.end(); )     {         if (*i == 4)         {             i = va.erase(i);         }         else { i++; }     }     for (auto i : va)     {         std::cout << i << "  ";     }     return 0; }

 

 

 

 

 

结束语:本篇针对的是基础知识,不喜勿喷!

    在这个浮躁的社会,有很多人都不注重基础,然而他们并不知道的是:就算你一时之间觉得些成就,长远之后的弊病会更加难以消除

    勿在浮沙筑高台

© 著作权归作者所有

刘大神
粉丝 8
博文 21
码字总数 18133
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(2)

刘大神
刘大神 博主

引用来自“临峰不畏”的评论

在迭代器循环中删元是是常见的错误。
是的是的,虽然发出来,提醒一下,很多人不会注意到这样的问题
临峰不畏
临峰不畏
在迭代器循环中删元是是常见的错误。
STL_不定长数组-vector

vector是一个模板类。vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作 所需头文件:#incl...

Big_laoshu
2017/10/25
0
0
C++ STL中map.erase(it++)用法原理解析

之前在代码中使用map::erase函数时,误搬了vector::erase的用法,导致Server down掉了,好在在测试环境就及时发现了问题,在上线前进行了补救==。 以下总结一下map::erase的正确用法。 首先看...

yousss
2018/04/25
0
0
vector C++ 详细用法

原文地址::http://blog.csdn.net/edify/article/details/4035243 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是...

乐逍遥jun
2016/02/22
9
0
STL容器总结

一. 种类: 标准STL序列容器:vector、string、deque和list。 标准STL关联容器:set、multiset、map和multimap。 非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一个重型字符...

sharep
2013/08/03
0
0
STL--迭代器失效

迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可...

陈国成
2017/06/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

关于IOS手机照相机上传的图片被逆时针旋转90度的PHP处理方法

IOS相机拍照上传的照片,竖屏会被逆时针旋转90度,原因是照片的特性,这里后端可以做下特殊处理 用到的函数是exif_read_data,这个函数需要开启php_exif扩展 Orientation就是图片的定位特性,...

sjcehui2010
16分钟前
3
0
开机从开机动画到launcher启动会闪一下壁纸

注掉vender下app

安卓工程师王恒
16分钟前
4
0
云原生生态周报 Vol.10 | 数据库能否运行在 K8s 当中?

业界要闻 IBM 以总价 340 亿美元完成里程碑意义的红帽收购:这是这家拥有 107 年历史的公司史上规模最大的一笔收购,该收购金额在整个科技行业的并购史上也能排到前三。在当天公布的声明中,...

阿里巴巴云原生
18分钟前
6
0
容器技术的未来——京东云技术专访

据相关调研机构出具的报告数据显示,目前应用容器市场规模将从2016年的 7.62亿美元增⻓到2020年的27亿美元。 显而易见,引入容器所展现的巨大灵活性有效推动了其采用速率,使企业日益依赖该技...

京东云技术新知
22分钟前
5
0
【译】用SQL统一所有:一种有效的、语法惯用的流和表管理方法

现在还没有一个统一的流式SQL语法标准,各家都在做自己的。本文在一些业界应用的基础上提出了一个统一SQL语法的建议。Spark同样存在这个问题,社区版本在流式SQL上迟迟没有动作。EMR Spark在...

阿里云官方博客
22分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部