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。

 

posted @ 2014-06-05 16:31  cLockey  阅读(54199)  评论(0编辑  收藏  举报