vector 中删除元素的方法是:b.erase(it);  //b是vector, it 是 vector::iterator

但是删除vector 中的元素有些诡异(^_^),稍不注意,就会出错。

下面先给出基本vector ,如下代码,然后我们来删除为3的元素。

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>using namespace std;int main()
{int a[7] = {1,2,3,3,4,5,3};//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间)vector<int> b(a, a+7);vector<int>::iterator  it;for(it = b.begin(); it != b.end(); it++){cout << *it << "\t" ;}cout << "\n" << endl ;
}

第一个代码如下,这个是错误的:

 for(it=b.begin(); it!=b.end(); it++){if( *it == 3)b.erase(it);}

乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当b.erase(it)之后,it就变成了一个野指针,对一个野指针进行 it++ 是肯定会出错的。 运行时报异常。

查看MSDN,对于erase的返回值是这样描述的:An iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists,于是改代码:

 for( it=b.begin(); it!=b.end(); it++){if( *it== 3)it= b.erase(it);}

这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 ++ 操作)

正确的代码应该为:

 for( it=b.begin(); it!=b.end();){if( *it== 3)it= b.erase(it);else it++;}

在后面添加

for(it = b.begin(); it != b.end(); it++){cout << *it << "\t" ;}cout << "\n" << endl ;

核实我们实现了预期。 1 2 4  5

下面用另一个代码方式实现,这也是正确的代码:

 for(int i=0;i<b.size();){if(b[i]==3)b.erase(b.begin()+i);elsei++;}

这2个代码的关键是去掉it++ 或者 i++, 这个在代码循环里不删除元素时才运行,都在else 里面。

我最开始是学了 https://blog.csdn.net/daofengdeba/article/details/7865229, 他是我的老师。

vector 中元素的删除相关推荐

  1. vector中元素的删除

    如果想要删除vector中值为val的元素,最容易想到的方法就是对vector进行遍历,然后遇到值为val时就将其删除.比较好的是vector容器有erase操作. 但是这儿需要注意,与list中的e ...

  2. 3.5链表----链表中元素的删除(只删除一个元素情况)

    3.5链表----链表中元素的删除(只删除一个元素情况) 该部分与上一节是息息相关的,关于如何在链表中删除元素,我们一步一步来分析: 一.图示删除逻辑 假设我们需要在链表中删除索引为2位置的元素,此时 ...

  3. ArrayList中元素的删除操作

    ArrayList中元素的删除操作 在聊 ArrayList 的删除删除操作之前,先来说说它的遍历方法. 一个 list 的遍历方法主要有三种: Iterator 迭代器遍历 遍历下标 for 循环遍 ...

  4. C++之vector中元素的N种遍历

    随着C++11标准的出现,C++标准添加了许多有用的特性,C++代码的写法也有比较多的变化.vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法. 假设有这样的一个ve ...

  5. 【c++】vector中删除元素

    1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数pop_back()可以删除最后一个元素. 而函数erase()可以 ...

  6. java.util.vector中的vector的详细用法

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些  import java.util.*; /**  * 演示Vector的使用.包括Vector ...

  7. vector用法 java_java.util.vector中的vector的详细用法

    /** *演示Vector的使用.包括Vector的创建.向Vector中添加元素.从Vector中删除元素.*统计Vector中元素的个数和遍历Vector中的元素.*/ public class ...

  8. vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析

    目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...

  9. 使用迭代器从map或vector中删除元素

    std:map的迭代器:删除时只影响当前元素 #include "stdafx.h" #include <map>std::map<int, int> m; ...

最新文章

  1. STL中基本容器有: string、vector、list、deque、set、map
  2. 推荐一个不到300k的Gif处理神器 - Gifsicle(免费下载)
  3. python的for语句有几种写法_Python if 和 for 的多种写法
  4. 解决IE为7939.com的病毒~
  5. 【免费毕设】asp.net网上选课系统的设计与实现(源代码+lunwen)
  6. Java学习之路 之 异常总结篇
  7. C语言宏定义,内置宏的用法
  8. python画航线图_pyecharts绘制geo地图
  9. 《计算机网络教程》(微课版 第五版) 第二章 物理层 课后习题及答案
  10. python写法教程_Python的表达式写法
  11. Linux日文教程,在Deepin/Ubuntu下安装fcitx-Anthy以输入日语(日文)
  12. 复试21天Day 21
  13. 设计模式——仲裁模式
  14. win10开机系统恢复(WinRE)中找不到系统恢复映像或功能不全的解决方法
  15. Python练习3:求N的多次方
  16. obsolete or deprecated parameter(s) specified for RDBMS instanc
  17. Oracle ORA-01460报错解决方法
  18. 【Python】 网格策略回测(日内高频数据)
  19. python字典相同键合并_在Python中用相同的键合并两个字典
  20. Supervisor 进程管理

热门文章

  1. 详细介绍 Apache Licence 2.0 协议
  2. OpenGL绘制心形函数
  3. 关于并口控制实验中用到的接口板及驱动板
  4. Vitis 软件平台安装
  5. php免费虚拟商城系统,MCmore商城系统是免费的php网店系统
  6. Movist for Mac(媒体播放器)
  7. 超级计算机主要原理,超级计算机原理与操作(1)
  8. flarum主题帖子相关属性修改
  9. Windows Service 2012 IIS Microsoft excel Application
  10. PDF的查找和替换在哪里?如何全部替换?