vector中删除的注意事项
erase的函数原型有两种形式:
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
例如有一个类A,
class A
{
public:
int id;
A(void);
~A(void);
};
定义vector<A*> vec
for (int i=0; i<10; i++)
{
A *p = new A();
p->id = i;
vec.push_back(p);
}
下面要删除vec中id为5的元素:
for(vector<A*>::iterator iter=vec.begin(); iter!=vec.end(); iter++)
{
if(5 == (*iter)->id)
{
delete *iter;
veci.erase(iter);
}
}
初看这段代码没什么问题,实际上其中存在很大的问题;当调用erase方法后,iter就变成了一个野指针,继续循环iter++就出错了。
那我们继续修改代码:
for(vector<A*>::iterator iter=vec.begin(); iter!=vec.end(); iter++)
{
if(5 == (*iter)->id)
{
delete *iter;
iter = veci.erase(iter);
}
}
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
仔细阅读上面的代码实际上也有问题,首先代码不能删除连续两个为5的元素,因为删除第一个之后,iter指向第二个,自增后,就指向了第二个后面了;其次如果元素5位于vector最后,删除后iter自增也会出错。
那么正确的写法可以如下:
for(vector<A*>::iterator iter=vec.begin(); iter!=vec.end(); )
{
if(5 == (*iter)->id)
{
delete *iter;
iter = veci.erase(iter);
}
else
{
iter++;
}
}
这样就可以解决连续两个相同元素的问题,同时将要删除的元素位于最后的话,也不会有问题,因为删除后,erase返回vector.end()。
其实还可以采用另一种方法,在STL的算法中有一个函数remove,这个函数可以将迭代器范围内的等于某个值的元素“删除“(这里的删除是不改变容器的 大小,只是将一些不满足条件的元素前移,这样的话保留的元素都移到了容器的前面,而remove正好就指向这些保留元素后的第一个元素,而后面的就是要删 除的。)然后执行erase操作就可以了
void remove_v2(vector<int>& v,int val){
v.erase( remove(v.begin(),v.end(),val), v.end() );
}
vector中删除的注意事项的更多相关文章
- vector中erase用法注意事项
以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e ...
- vector中删除第k个元素的巧妙方法
假设我们定义了一个vector如下: vector<int> v;v.push_back(1);...v.push_back(255); 如果要删除第k个元素的话,应该这样写: (1)如果 ...
- 【转】java.util.vector中的vector的详细用法
[转]java.util.vector中的vector的详细用法 ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.uti ...
- java.util.vector中的vector的详细用法
ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...
- 【转】vector中erase()的使用注意事项
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase( iterator _Whe ...
- vector中的元素删除
删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! ...
- C++之vector中元素删除
今天在删除vector中的元素中遇到一个问题,这里记录下来以便以后查阅. 预备知识:用到了erase()函数,对于一个容器c来说,假设迭代器为p,那么执行: c.erase(p)之后就删除了容器c中p ...
- 对于vector中高效删除中间元素的技巧
众所周知,vector是连续存储空间,只提供高效的尾部删除方法pop_back() ,在中间删除的效率很低,那么如果大家想快速删除中间元素该如何实现? 话不多说,看代码: //移除vector元素,最 ...
- vector容器删除某些元素且释放内存
1,size和capacity size: 指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小. capac ...
随机推荐
- [心平气和读经典]The TCP/IP Guide(000)
The TCP/IP Guide [Page 39] The TCP/IP Guide: Introduction and "Guide to The Guide" | 第1章 概 ...
- POJ 1577 Falling Leaves 二叉搜索树
HDU 3791 Falling Leaves 二叉搜索树 Figure 1Figure 1 shows a graphical representation of a binary tree of ...
- jquery 选择唯一值 选择器“”非“用法
$(document).ready(function () { $("#addwork").hide(); $(".xi").click(function(){ ...
- LOJ #6022. 重组病毒
Description 支持以下操作 1.access一个点 2.问一个点上面的重链的个数 3.换根 , 并access原来的根 Solution 对于重链个数 , 我们在 \(access\) 的时 ...
- 有关css和js针对不同浏览器兼容的问题
首先谈一下浏览器,虽然现在ie依然是浏览器市场的老大,大约占有67%的份额,但是由于其各方面的欠缺,用户开始选择其他浏览器作为自己浏览网页的主要 工具,比如firefox.theworld.maxth ...
- unity GUI Layout 组件(全)
[expand 扩张][fitter 装配工] [envelope 信封,包装] Layout 布局 三种. Horizontal Layout Group 水平布局 Padding:内边距,单位 ...
- SVG 旋转图形实例
本实例展示如何在SVG中画出一个正方形并使之旋转.运行结果如下图所示: 在文本框中输入时间间隔,单位是毫秒.点击Start按钮,蓝色方块就会开始转动,每个时间间隔变化一度.变换的角度在下面的Angle ...
- Docker学习(一): 基本概念
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Java学习--jsp基础语法
<%! %>和<% %>的区别: <%! //1.可定义方法 //2.可定义static方法 //3.可定义static属性 //4.不可以使用out对象 %> ...
- GIT使用log命令显示中文乱码
背静: 公司项目使用GIT进行代码同步. 问题: 之前代码提交后,有中文备注,但是在使用git log查看代码历史记录的时候发现显示乱码,如下: 后查询相关资料,现将解决办法总结如下: 1.运行Git ...