C++中使用vector.erase()需要注意的事项
本人菜鸟一枚。。
今天在用vector.erase()的时候,发现总是不能把应该erase掉的东西erase干净。
举个栗子:
vector<int> num_vec; num_vec.push_back(1); num_vec.push_back(3); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(6); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(9); for (int i=0; i<num_vec.size(); i++) { if (num_vec[i] == 5) { num_vec.erase(num_vec.begin()+i); } }
乍一看似乎没问题。
首先,用num_vec[i]而不用迭代器iterator可以避免出现“野指针”的问题,但是不知道二者性能上有没有差别;
其次,执行num_vec.erase(num_vec.begin()+i);操作后,num_vec中减少一个元素,这时num_vec[i]代表的将会是被删除元素的下一个元素,这样继续走下去似乎没有问题。
但是输出结果却是:1,3,5,6,5,5,9。
从结果可看出来,每次删除一个元素后,都会跳过下一个元素,继续执行。仔细一想,才发现执行下一次for循环时i++了,所以就跳过了一个元素。
因此在erase掉一个元素后,应该让i--才行。
正确代码如下:
vector<int> num_vec; num_vec.push_back(1); num_vec.push_back(3); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(6); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(5); num_vec.push_back(9); for (int i=0; i<num_vec.size(); i++) { if (num_vec[i] == 5) { num_vec.erase(num_vec.begin()+i); i--; } }
输出结果为:1,3,6,9。