zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    ES6中map数据结构学习
    React中,input外边如果包一个div,可以把input的onChange事件绑定到div上面,并且也生效
    筛数组
    字符串slice、substring、substr
    DVA-subscriptions
    react hooks学习
    React会自动把虚拟DOM数组展开
    React+Redux+Dva学习
    [转] 关于卫星轨道的科普
    边缘计算在智慧城市中的应用【摘录】
  • 原文地址:https://www.cnblogs.com/cLockey/p/3770622.html
Copyright © 2011-2022 走看看