【转】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