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> ...
随机推荐
- 用Android Studio 出现的问题
解决的办法是cmd--恢复网络设置---netsh winsock reset----重启电脑解决.
- Localization要从第一天开始计划
最近E3,微软说可以在任何region玩任何语言的游戏了.换一个语言么,听起来没有那么复杂,其实操作起来还得是从软件工程初期就好好计划. Windows在很长一段时间,你安装完了,就不能换语言了.大学 ...
- Java中的List操作
1. 数组转List String[] arr={"1","2","3"}; List<String> list = Array ...
- UVa 712 S树
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- ✡ leetcode 172. Factorial Trailing Zeroes 阶乘中的结尾0个数--------- java
Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...
- spring logback 配置
<appender name="DubboInfo" class="ch.qos.logback.core.rolling.RollingFileAppender& ...
- 前端基础 JavaScript~~~ 数据处理 奇技淫巧!!!!!!
常用的JS数据处理手段 2016-09-21 17:40:07 1. number类型 数组中取出里面的最大/最小值: // 数组中取出 最小值 [数值] var n ...
- dict
1.创建新字典(根据语法和dict初始化方法) >>> my_dict={'a':1,'b':2,'c':3} >>> my_dict=dict({'a':1,'b ...
- Makefile简易教程
本文部分内容引用: 中文维基百科. 一个简单的Makefile教程. Makefile简介 在软件开发中,make通常被视为一种软件构建工具.该工具主要经由读取一种名为"makefile&q ...
- 1.15 kickstart rpm yum
###########bootstrap 启动加载器 (pxelinux.0)传输pxelinux.cfg NIC #network interface PXEpxelinux.0/tftp/pxel ...