vector 中元素的删除
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 中元素的删除相关推荐
- vector中元素的删除
如果想要删除vector中值为val的元素,最容易想到的方法就是对vector进行遍历,然后遇到值为val时就将其删除.比较好的是vector容器有erase操作. 但是这儿需要注意,与list中的e ...
- 3.5链表----链表中元素的删除(只删除一个元素情况)
3.5链表----链表中元素的删除(只删除一个元素情况) 该部分与上一节是息息相关的,关于如何在链表中删除元素,我们一步一步来分析: 一.图示删除逻辑 假设我们需要在链表中删除索引为2位置的元素,此时 ...
- ArrayList中元素的删除操作
ArrayList中元素的删除操作 在聊 ArrayList 的删除删除操作之前,先来说说它的遍历方法. 一个 list 的遍历方法主要有三种: Iterator 迭代器遍历 遍历下标 for 循环遍 ...
- C++之vector中元素的N种遍历
随着C++11标准的出现,C++标准添加了许多有用的特性,C++代码的写法也有比较多的变化.vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法. 假设有这样的一个ve ...
- 【c++】vector中删除元素
1.删除指定范围的元素 vector删除元素之pop_back(),erase(),remove() 向量容器vector的成员函数pop_back()可以删除最后一个元素. 而函数erase()可以 ...
- java.util.vector中的vector的详细用法
ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector ...
- vector用法 java_java.util.vector中的vector的详细用法
/** *演示Vector的使用.包括Vector的创建.向Vector中添加元素.从Vector中删除元素.*统计Vector中元素的个数和遍历Vector中的元素.*/ public class ...
- vector中的push_back(涉及到动态分配),resize,reserve,swap方法解析
目录 一.vector的push_back解析 二.size和capacity 三.resize和reserve 1.resize 2.reserve 四.关于reserve的应用 五.内存释放 sw ...
- 使用迭代器从map或vector中删除元素
std:map的迭代器:删除时只影响当前元素 #include "stdafx.h" #include <map>std::map<int, int> m; ...
最新文章
- STL中基本容器有: string、vector、list、deque、set、map
- 推荐一个不到300k的Gif处理神器 - Gifsicle(免费下载)
- python的for语句有几种写法_Python if 和 for 的多种写法
- 解决IE为7939.com的病毒~
- 【免费毕设】asp.net网上选课系统的设计与实现(源代码+lunwen)
- Java学习之路 之 异常总结篇
- C语言宏定义,内置宏的用法
- python画航线图_pyecharts绘制geo地图
- 《计算机网络教程》(微课版 第五版) 第二章 物理层 课后习题及答案
- python写法教程_Python的表达式写法
- Linux日文教程,在Deepin/Ubuntu下安装fcitx-Anthy以输入日语(日文)
- 复试21天Day 21
- 设计模式——仲裁模式
- win10开机系统恢复(WinRE)中找不到系统恢复映像或功能不全的解决方法
- Python练习3:求N的多次方
- obsolete or deprecated parameter(s) specified for RDBMS instanc
- Oracle ORA-01460报错解决方法
- 【Python】 网格策略回测(日内高频数据)
- python字典相同键合并_在Python中用相同的键合并两个字典
- Supervisor 进程管理