• 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。

  • 相关阅读:
    《深度探索C++对象模型》1
    《C++标准库》
    关于多级分类的封装
    git常用命令
    使用BigDecimal进行精确运算
    关于强制装换
    page分页
    pageContext.request.contextPath 和 request.getContextPath()
    springMVC + mybatis 搜索 分页等
    mybatis 动态sql
  • 原文地址:https://www.cnblogs.com/cLockey/p/3770622.html
Copyright © 2020-2023  润新知