C++ vector erase函数的使用注意事项
最近使用了顺序容器的删除元素操作,特此记录下该函数的注意事项。
在C++primer中对c.erase(p) 这样解释的:
c.erase(p) 删除迭代器p所指向的元素,返回一个指向被删元素之后元素的迭代器,若p指向尾元素,则返回尾后迭代器,若p是尾后迭代器,则会产生未定义行为。
这个函数我在使用的过程中发现有那么一点小小的注意事项
如果要想遍历一个容器,并且删除某个不符合要求的元素,那么最好使用while而不是使用for
因为
vector<RotatedRect>::iterator it = m_rect.begin();
while((it) != m_rect.end()){
float diff = abs((*it).size.width - (*(it + )).size.width);
if( diff > diffmax){
if(( it - m_rect.begin()) < (m_rect.size() / )) it = m_rect.erase(it); //此时指针已经指向下一个元素,故指针不需要再自增
else it = m_rect.erase(it + );
}else{
it++; //否则指针自增一,while循环可以选择有条件的让指针指向下一个元素
}
}
vector<RotatedRect>::iterator it = m_rect.begin();
for( ;(it) != m_rect.end(); it++ ) //如果使用for循环,并且选择在此处自增一
{
float diff = abs((*it).size.width - (*(it + )).size.width);
if( diff > diffmax){
if(( it - m_rect.begin()) < (m_rect.size() / )) it = m_rect.erase(it); //那么将会与这里的自增重复,这样会造成有元素被跳过
else it = m_rect.erase(it + );
}
}
我在查阅资料时发现有个博主推荐的写法是这样的
此处链接http://blog.csdn.net/zhuimengzh/article/details/6841500
void fun()
{
vector<int> iVec;
vector<int>::iterator it;
for(int i=;i<;i++)
iVec.push_back(i);
display(iVec);
for(it=iVec.begin();it!=iVec.end();++it)
{
if(*it == || *it == )
{
it=iVec.erase(it);
--it;//这里回退一个 //******该博主推荐在此处自动回退一个,这样貌似可以用for循环了,但是其实不是的
}
}
display(iVec);
}
如果你删除的元素是容器的第一个元素,那么回退的行为将是未定义的,切记
C++ vector erase函数的使用注意事项的更多相关文章
- map 和 vector 的erase函数说明
1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: (1) void erase (it ...
- C++中使用vector.erase()需要注意的事项
本人菜鸟一枚.. 今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净. 举个栗子: vector<int> num_vec; num_vec.p ...
- vector.erase用法注意事项
转自->这里 vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(iterat ...
- 正确使用stl vecotr erase函数
erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素. 返回值是指向删除的最后一个元素的下一位置的迭代器 Parameters All parameters ar ...
- C++ - 容器(container)的erase()函数
容器(container)的erase()函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23996013 容器(contai ...
- vector成员函数解析
vector线性集装箱,其元素颜格排序根据线性序列,和动态数组很阶段似,像阵列,它的元素被存储在连续的存储空间,这也意味着,我们不仅能够使用迭代器(iterator)访问元素,也可以用一个指针访问偏移 ...
- 在容器中使用erase函数,迭代器的处理
在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数: 返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...
- STL的erase函数和lower_bound
前提摘要: [1]一般我们的区间是左闭右开,如下面例子2. [2]erase函数谨慎使用. [3]map也是有序保存的. [erase] 1,删除字符串的首字母: string s="ecu ...
- 【C/C++开发】容器set和multiset,C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())
一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...
随机推荐
- PHP 如何获取当前的域名
PHP 如何获取当前的域名.这是PHP最基础的东西,也是用得最多的,记录下来 <? //获取当前的域名: echo $_SERVER['SERVER_NAME']; //获取来源网址,即点击来到 ...
- oracle数据迁移、备份等
exp db 或者数据泵. 或者ETL工具
- 微信朋友圈转疯了(golang写小爬虫抓取朋友圈文章)
很多人在朋友圈里转发一些文章,标题都是什么转疯啦之类,虽然大多都也是广告啦,我觉得还蛮无聊的,但是的确是有一些文章是非常值得收藏的,比如老婆经常就会收藏一些养生和美容的文章在微信里看. 今天就突发奇想 ...
- sleep和wait的区别?
sleep指线程被调用时,占着CPU不工作,形象地说明为"占着CPU睡觉",此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制.wait指线程处于进入等待状态,形象 ...
- LINUX测试环境部署mysql(三)
安装配置mysql 1.安装 查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 查看有没有安装包: yum list mysql* 安 ...
- pwnable simple login
这是一周前做的一道题目,总的来说这道题很简单,当然一开始看了半天没发现溢出点也是十分的惭愧,题目出的很良心,思路就是溢出之后我们可以控制main函数的ebp, 进而在main函数返回时进行漏洞利用. ...
- (zhuan) Deep Reinforcement Learning Papers
Deep Reinforcement Learning Papers A list of recent papers regarding deep reinforcement learning. Th ...
- Python的标准输出
遇到什么就添加到这里来. 首先,是最基本的. print "Number is %d %f %s"%(intA,floatB,stringC) 如果对浮点数的精度有所要求的话,比如 ...
- C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
系列1 曾经说过:每个线程都有自己的资源,但代码区是共享的,即每个线程都可以执行相同的函数. 这可能带来的问题就是多个线程同时执行一个函数,并修改同一变量值,这将导致数据的 ...
- windows脚本调用批处理
set ws=wscript.createobject(“wscript.shell”)ws.run “batchfn.bat /start”,0 save as xxx.vbe file.