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。

  • 相关阅读:
    R 画structure图
    perl ExtUtils::Manifest
    解决libstdc++.so.5问题
    R ggplot2 线性回归
    perl 计算方差中值平均数 Statistics::Descriptive;
    专题(十一)scp
    tcpdump的使用
    专题 (四) sed
    python 学习笔记(二)之 字符串操作
    redis 学习笔记之(二)主备高可用(热备)
  • 原文地址:https://www.cnblogs.com/cLockey/p/3770622.html
Copyright © 2011-2022 走看看