STL容器中的erase函数调用问题

自我感觉,erase函数返回一个迭代器,指向被删除元素的下一个位置,不是很合理。

啥也不说,直接上代码:

int findNum = 2;
    int array[] = { 1, 2, 2, 4, 5, 6 };
    vector<int> ivec(array, array + sizeof(array) / sizeof(*array));
    for (vector<int>::iterator iter = ivec.begin(); i != ivec.end(), iter++)
    {
        if (*iter == findNum)
        {
            iter = ivec.erase(iter);
            continue;
        }
        else
        { }
    }

这段代码,看似没有问题,实则,iter重新赋值之后,然后再次++,会跳过一个元素,在这个例子中,就是第三个元素2会被跳过。

换个条件,把要查找的元素由2改为6会发生什么,死循环了或者直接崩了,其中道理不言而喻,continue之后iter已经是等于end()了,然后再次++,会指向end()之后的位置,这个位置是非法的。

第一步,在continue之前,加上iter--

只对了一半,试着把查找元素换成1,会出现什么问题呢,iter--会崩溃。

所以,还需要增加一个判断:

if(iter != ivec.begin()) iter--;

这个问题也可以将for循环的循环递增语句iter++从头部移到循环体中,在else中进行++操作。

时间: 2024-07-28 23:04:38

STL容器中的erase函数调用问题的相关文章

如何选择STL容器中对象的删除方法

备注:唯一从容器中除去一个元素的方法是在那个容器上调用一个成员函数. 以下介绍删除不同类型的容器中满足某种条件的值的方法,某种条件指的是 bool badValue(int value)返回true的情况. 1.序列容器 for(SeqContainer<int>::iterator i = c.begin(); i != c.end(); /*nothing*/) { if(badValue(*i)) { //something to do i = c.erase(i); } else ++

c++中STL容器中的排序

1.c++STL中只有list自带了排序函数: (1).若list中存放的是int类型或者string类型,直接利用sort即可: list <int> list1; list1.sort(); 此时默认为升序,若要使用降序,直接自定义cmp函数即可. (2).若存放的是结构体或其他指针类型,需要自己定义比较结构体: struct student { int num;}; struct node { bool operator()(student a,student b) return a.n

stl容器中的 .front()函数隐士转换

周末,睡了两个好觉.前天把周任务完成了,在看公司项目源码.发现std::map 的.front函数会发生隐士转换. 伪代码如下: std::map<int,int> m_map; int &i = m_map.front(): // .fornt 函数书上写的是返回一个引用. m_map.pop_push(); //弹出第一个 映射 return i; //当时就郁闷了,这样做不会出错吗? //仔细看是这样的 int i = m_map.front(); //这里转换了,当时蒙蒙冲的,

自定义String类,并且实现在STL容器中添加自定义的类型

13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 13.47 添加拷贝构造函数和拷贝赋值运算符,并添加打印语句,则每次函数执行时打印一条信息. 13.48 定义一个vector<String>并在其上多次调用push_back.运行程序,观察String被拷贝了多少次. #include<iostream> #include<st

STL:remove和erase区别

C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢? vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的size vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size list容器中的remove 成员函数,原型是void remove (const value_type& val);作用是删除list中值与val相同的节点,释放该节

【C++】STL容器归纳总结(一)顺序容器

顺序容器: 顺序容器包括:vector.deque.list.forward_list.array以及string vector:可变大小数组,即将元素保存在一段连续的内存空间中.支持快速随机访问.在尾部之外的位置插入删除元素可能会很慢. PS:当元素已经占满了预先分配的内存空间,插入新的元素时,开辟一段新的内存空间,大小为之前vector的两倍,再将vector内的元素拷贝到新的内存空间内. vector的插入删除操作会造成迭代器的失效 list:双向链表.只支持双向顺序访问.在list任何位

STL - STL容器的适用情况

原文地址:http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ 一.各种容器的特性 vector 典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取.修改具有常数时间复杂度,在序列尾部进行插入.删除是常数时间复杂度,但在序列的头部插入.删除的时间复杂度是O(n),可以 在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑. deque 序列容器,

STL容器的适用情况

转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; mso-bidi-font-family:"times new roman"; mso-bidi-theme-font:minor-bidi;} @page {mso-page-border-surround-header:no; mso-page-border-surround-footer

[转] C++ STL中map.erase(it++)用法原理解析

总结一下map::erase的正确用法. 首先看一下在循环中使用vector::erase时我习惯的用法: for(vector<int>::iterator it = vecInt.begin(); it != vecInt.end();) { if(*it == 0) { it = vecInt.erase(it); } else { it++; } } 程序从一个vector中删除值为0的元素,利用了vector::erase函数根据iterator删除某个元素时会返回下一个元素的ite