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> ...
随机推荐
- Java高级规范之四
四十一.控制层不能调用model层除了最顶级的接口外的任何内容.要通过new顶级接口才能调用. 不规范示例: public class UserServiceImpl{ private UserDAO ...
- 解决织梦DEDEcms指定arclist的特定ID排序的方法
转载网址:http://blog.hrseo.net/xuexi/184.html 替换/include/taglib/arclist.lib.php这个文件,下载链接: http://pan.bai ...
- css 设置背景图片模糊,内容不模糊
需求:一个div设置了background: url,现在需要使图片背景模糊,div内的文字清晰显示. 原始代码: <!DOCTYPE html> <html lang=" ...
- 数据获取以及处理Beta版本展示
产品描述 这个产品的目的是为了学霸网站提供后台数据获取以及处理操作.在alpha阶段基本调通的基础至上,我们希望在bate版本中加入对于问答对的处理,图片的获取等功能. 预期目标 在alpha阶段,我 ...
- Beta版本发布说明
发布地址 https://github.com/LongWerLingShi/DataObtainingAndHandling/tree/beta 版本开发背景 首先,应软件工程课程要求,我们小组针对 ...
- 《C与指针》第十五章练习
本章例程 15.1打开和关闭文件 #include <stdlib.h> #include <stdio.h> int main(int ac, char **av) { in ...
- SpringMvc 页面DATE传值问题
页面传过来yyy-MM-dd格式的日期类型,springMVC是不认的. 解决办法: @DateTimeFormat(pattern="yyyy-MM-dd") 在类属性上加上注解 ...
- 使用cordova插件barcodescanner遇到的坑
最近接手了一个app任务,由于不懂android和ios,只想简单点写代码,所以,最终采用了基于H5的web框架:ionic + cordova(也叫phonegap)来开发.app的设计中有一个扫描 ...
- C# 指定Webbrowser控件所用IE内核版本
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe,以64位机 ...
- 理解jquery的$.extend()、$.fn和$.fn.extend()
jQuery为开发插件提拱了两个方法,分别是: jQuery.fn.extend(); jQuery.extend(); jQuery.fn jQuery.fn = jQuery.prototype ...