最近使用了顺序容器的删除元素操作,特此记录下该函数的注意事项。

在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函数的使用注意事项的更多相关文章

  1. map 和 vector 的erase函数说明

    1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: (1) void erase (it ...

  2. C++中使用vector.erase()需要注意的事项

    本人菜鸟一枚.. 今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净. 举个栗子: vector<int> num_vec; num_vec.p ...

  3. vector.erase用法注意事项

    转自->这里 vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(iterat ...

  4. 正确使用stl vecotr erase函数

    erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素. 返回值是指向删除的最后一个元素的下一位置的迭代器 Parameters All parameters ar ...

  5. C++ - 容器(container)的erase()函数

    容器(container)的erase()函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23996013 容器(contai ...

  6. vector成员函数解析

    vector线性集装箱,其元素颜格排序根据线性序列,和动态数组很阶段似,像阵列,它的元素被存储在连续的存储空间,这也意味着,我们不仅能够使用迭代器(iterator)访问元素,也可以用一个指针访问偏移 ...

  7. 在容器中使用erase函数,迭代器的处理

    在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数:   返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...

  8. STL的erase函数和lower_bound

    前提摘要: [1]一般我们的区间是左闭右开,如下面例子2. [2]erase函数谨慎使用. [3]map也是有序保存的. [erase] 1,删除字符串的首字母: string s="ecu ...

  9. 【C/C++开发】容器set和multiset,C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())

    一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...

随机推荐

  1. jQuery取得select 选中值和文本 来自园友“大气象”

    本来以为jQuery("#select1").val();是取得选中的值, 那么jQuery("#select1").text();就是取得的文本. 这是不正确 ...

  2. Add and Search Word

    Trie 树的一个应用 Design a data structure that supports the following two operations: void addWord(word) b ...

  3. Angular--$http服务

    关于Angular中$http 服务是对XMLHttpRequest 对象的封装,向服务器发送请求: 下面自己在angular中$http学习的一个记录, GET请求(先贴码) angualr代码: ...

  4. C++中的new与delete(二)

    C++一个对象构造的完整过程为:分配内存和初始化,这也是new关键字所实现的功能,分配内存可通过重载new操作符来实现,系统初始化可通过调用构造函数来完成.我们不能改变new关键字的功能,但可以改变分 ...

  5. 深入理解 C 语言的函数调用过程

    来源: wjlkoorey 链接:http://blog.chinaunix.net/uid-23069658-id-3981406.html 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体 ...

  6. folly::AtomicHashmap源码分析(一)

    本文为原创,转载请注明:http://www.cnblogs.com/gistao/ Atomic的两点背景 看下这个场景,老张去厕所,发现门是锁着的,他就在门口等着里边人出来,此时小王也来了,他想了 ...

  7. iOS 动态下载系统提供的中文字体

    使用系统提供的中文字体,既可避免版权问题,又可以减小应用体积 #pragma mark - 判断字体是否已经被下载 - (BOOL)isFontDownLoaded:(NSString *)fontN ...

  8. 彩票号码OC呈现

    +(NSArray*)splitCode:(NSString*)code backzoneIndex:(NSInteger*)outIndex { /* 01 0102|0304 0102030405 ...

  9. 我的第一个GitHub仓库

    GitHub 仓库地址 https://github.com/FBean/test.git GitHub 常用命令 add--Add file contents to the index bisect ...

  10. DELPHI类声明方式简介

    TMyDemo = class(TObject) FName: string; {数据成员(Field)} FAge: Integer; private {私有的} {最为隐秘的访问程度} proce ...