• 【转】vector中erase()的使用注意事项


    vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
    vector::erase()方法有两种重载形式
    如下:
    iterator erase(   iterator _Where);
    iterator erase(   iterator _First,   iterator _Last);
    如果是删除指定位置的元素时:
    返回值是一个迭代器,指向删除元素下一个元素;
    如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

    看下面的程序,目的是删除数组里面的所有值为6的元素:

     1 /**
     2 *description:vector中erase()函数的使用注意事项
     3 *author:CodingMengmeng
     4 *time:2017-08-18 20:46:28
     5 *example:删除vector中的6
     6 */
     7 //#include <iostream>
     8 //#include <vector>
     9 //using namespace std;
    10 //
    11 //int main()
    12 //{
    13 //    vector<int> array;
    14 //    array.push_back(1);
    15 //    array.push_back(6);
    16 //    array.push_back(3);
    17 //    array.push_back(6);
    18 //    array.push_back(6);
    19 //    array.push_back(2);
    20 //
    21 //    vector<int>::iterator itor;
    22 //    vector<int>::iterator itor2;
    23 //    for (itor = array.begin(); itor != array.end();)
    24 //    {
    25 //        if (6 == *itor)
    26 //        {
    27 //            itor2 = itor;
    28 //            itor = array.erase(itor2);
    29 //        }
    30 //        itor++;
    31 //    }
    32 //    for (itor = array.begin(); itor != array.end();)
    33 //    {
    34 //        cout << (*itor++) << endl;
    35 //    }
    36 //    return 0;
    37 //
    38 //}
    39 //输出
    40 //1
    41 //3
    42 //6
    43 //2

      可见,其中一个6并未删除,这是迭代器的问题。

      原因在于erase之后,itor已经指向下一个元素了,不应该再itor++,否则会跳过下一个元素,即连续两个6时,跳过了第二个6。另外,在itor2=itor时,两个itor是一样的,这样做并没有意义,可修改如下:

     1 /**
     2 *description:修改后
     3 *author:CodingMengmeng
     4 *time:2017-08-18 20:49:12
     5 */
     6 
     7 #include<iostream>
     8 #include <vector>
     9 using namespace std;
    10 
    11 int main()
    12 {
    13     vector<int> array;
    14     array.push_back(1);
    15     array.push_back(6);
    16     array.push_back(3);
    17     array.push_back(6);
    18     array.push_back(6);
    19     array.push_back(2);
    20     vector<int>::iterator itor;
    21     for (itor = array.begin(); itor != array.end();)
    22     {
    23         if (6 == *itor)
    24         {
    25             itor = array.erase(itor);
    26         }
    27         else
    28         {
    29             itor++;
    30         }
    31     }
    32     for (itor = array.begin(); itor != array.end();)
    33     {
    34         cout << (*itor++) << endl;
    35     }
    36     return 0;
    37 }
    38 
    39 //输出:
    40 //1
    41 //3
    42 //2
  • 相关阅读:
    php学习笔记之一维数组
    MVC开发人员必备的五大工具
    ASP.NET MVC 3和Razor中的@helper
    Oracle表空间不足ORA-01654
    oracle创建计划任务
    淘宝下单高并发解决方案
    网站集成QQ登录功能
    jquery的一个模板引擎-zt
    Asp.net gzip压缩的启用
    Windows7下面手把手教你安装Django
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/7392170.html
Copyright © 2020-2023  润新知