【转】vector中erase()的使用注意事项

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

看下面的程序,目的是删除数组里面的所有值为6的元素:

 1 /**
 2 *description:vector中erase()函数的使用注意事项
 3 *author:CodingMengmeng
 4 *time:2017-08-18 20:46:28
 5 *example:删除vector中的6
 6 */
 7 //#include <iostream>
 8 //#include <vector>
 9 //using namespace std;
10 //
11 //int main()
12 //{
13 //    vector<int> array;
14 //    array.push_back(1);
15 //    array.push_back(6);
16 //    array.push_back(3);
17 //    array.push_back(6);
18 //    array.push_back(6);
19 //    array.push_back(2);
20 //
21 //    vector<int>::iterator itor;
22 //    vector<int>::iterator itor2;
23 //    for (itor = array.begin(); itor != array.end();)
24 //    {
25 //        if (6 == *itor)
26 //        {
27 //            itor2 = itor;
28 //            itor = array.erase(itor2);
29 //        }
30 //        itor++;
31 //    }
32 //    for (itor = array.begin(); itor != array.end();)
33 //    {
34 //        cout << (*itor++) << endl;
35 //    }
36 //    return 0;
37 //
38 //}
39 //输出
40 //1
41 //3
42 //6
43 //2

  可见,其中一个6并未删除,这是迭代器的问题。

  原因在于erase之后,itor已经指向下一个元素了,不应该再itor++,否则会跳过下一个元素,即连续两个6时,跳过了第二个6。另外,在itor2=itor时,两个itor是一样的,这样做并没有意义,可修改如下:

 1 /**
 2 *description:修改后
 3 *author:CodingMengmeng
 4 *time:2017-08-18 20:49:12
 5 */
 6
 7 #include<iostream>
 8 #include <vector>
 9 using namespace std;
10
11 int main()
12 {
13     vector<int> array;
14     array.push_back(1);
15     array.push_back(6);
16     array.push_back(3);
17     array.push_back(6);
18     array.push_back(6);
19     array.push_back(2);
20     vector<int>::iterator itor;
21     for (itor = array.begin(); itor != array.end();)
22     {
23         if (6 == *itor)
24         {
25             itor = array.erase(itor);
26         }
27         else
28         {
29             itor++;
30         }
31     }
32     for (itor = array.begin(); itor != array.end();)
33     {
34         cout << (*itor++) << endl;
35     }
36     return 0;
37 }
38
39 //输出:
40 //1
41 //3
42 //2
时间: 2024-10-19 14:15:28

【转】vector中erase()的使用注意事项的相关文章

vector中erase使用

vector中erase用法注意事项 - daofengdeba - 博客频道 - CSDN.NEThttp://blog.csdn.net/daofengdeba/article/details/7865229 for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); ){     if( *iter == 3)          iter = veci.erase(iter);      else            i

vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性. erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); vector<int> veci;veci.push_

实习小白::(转) vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错.今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性. erase的函数原型有两种形式: iterator erase(iterator position); iterator erase(iterator first, iterator last); vector<int> veci; veci.push

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法

C++ vector中实际删除元素使用的是容器vecrot中std::vector::erase()方法. C++ 中std::remove()并不删除元素,因为容器的size()没有变化,只是元素的替换. 1.std::vector::erase() 函数原型:iterator erase (iterator position); //删除指定元素 iterator erase (iterator first, iterator last); //删除指定范围内的元素 返回值:指向删除元素(或

vector中的push_back函数的意思是什么

push_back   就是在vector的末尾插入一个元素, vector 中的erase()函数,从指定容器删除指定位置的元素或者某段范围内的元素,删除之后,返回值也是一个迭代器,指向最后一个删除元素的下一个元素, 出现的问题就是:迭代器变成了一个野指针,需要重新把迭代器的指针指向begin或者把返回的迭代器赋值给原来的迭代器,否则会报编译错误 iter = vetcor.erase(iter); or: vectore.erase(iter); iter=v1.begin;

map 和 vector 的erase函数说明

1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: ? 1 2 3 4 5 (1) void erase (iterator position); (2)size_type erase (const key_type& k); (3)void erase (iterator first, iterator last); 在C++11中: ? 1 2 3 4 5 (1)iterator 

BZOJ 2878([Noi2012]-失落的游乐园树DP+出站年轮加+后市展望DP+vector的erase)

2878: [Noi2012]迷失乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved: 223 [Submit][Status] Description 放假了,小Z认为呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现能够将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m仅仅可能等于n或者n-1). 小Z如今所在的大门也正好

删除vector中的偶数元素,删除list中的奇数元素

#include<vector> #include<list> #include<iostream> using namespace std; int main() { vector<int> vec={0,1,1,2,3,5,8,21,55,89}; list<int> li={0,1,1,2,3,5,8,21,55,89}; auto ve=vec.begin(); auto it=li.begin(); while(ve!=vec.end(

vector中的元素删除

删除vector中的元素,最容易的方法就是使用vector的erase()函数. vector vec;for ( vector::iterator iter = vec.begin(); iter! = vec.end();){    if(某条件成立)        iter = vec.erase(iter);    else        iter ++;} 如果要清空vector中的元素,可以使用erase()循环删除,也可以用clear()函数. for ( vector::iter