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

Posted 阿玛尼迪迪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于vector中erase()的使用注意事项的主要内容,如果未能解决你的问题,请参考以下文章

c++ vector erase的注意事项

vector中erase用法注意事项

vector 中需要注意的东西!

当vector使用erase 数组长度是不是改变

尝试在 Python 中重写 C++ 代码时出现问题:删除地图中的项目和“vector.erase(vector.end())”

stl中map的erase具体详解