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。

  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/cLockey/p/3770622.html
Copyright © 2011-2022 走看看