zoukankan      html  css  js  c++  java
  • vector.erase用法注意事项

    转自->这里

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

     1     #include<iostream>  
     2     #include<vector>  
     3     using namespace std;  
     4     int main()  
     5     {  
     6         vector<int> array;  
     7         array.push_back(1);  
     8         array.push_back(6);  
     9         array.push_back(3);  
    10         array.push_back(6);  
    11         array.push_back(6);  
    12         array.push_back(2);  
    13       
    14         vector<int>::iterator itor;  
    15         vector<int>::iterator itor2;  
    16         for(itor=array.begin();itor!=array.end();)  
    17         {  
    18             if(6==*itor)  
    19             {  
    20                itor2=itor;  
    21                itor=array.erase(itor2);  
    22       
    23             }  
    24             itor++;  
    25         }  
    26         itor=array.begin();  
    27         for(itor=array.begin();itor!=array.end();)  
    28         {  
    29             cout<<(*itor++);  
    30         }  
    31         getchar();  
    32         return 0;  
    33     }  

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

    运行结果输出1362,可见其中一个6并未删除,这是迭代器的问题。
    原因在于erase以后,itor已经指向下一个元素了,不应该在itor++,否则会跳过下一个元素,即连续两个6时跳过了第二个6.
    另外,在itor2=itor时,两个itor是一样的,这样做并无意义。可修改如下:

     1     vector<int>::iterator itor;  
     2     // vector<int>::iterator itor2;  
     3     for(itor=array.begin();itor!=array.end();)  
     4     {  
     5         if(6==*itor)  
     6         {  
     7             // itor2=itor;  
     8             itor=array.erase(itor);  
     9         }  
    10         else  
    11         {  
    12             itor++;  
    13         }  
    14     }  

    或者:

    1     vector<int>::iterator itor;  
    2     for(itor=array.begin();itor!=array.end();itor++)  
    3     {  
    4         if(6==*itor)  
    5         {  
    6             itor=array.erase(itor);  
    7             itor--;  
    8         }  
    9     }  

    也可以使用remove方法:
    array.earse( remove(array.begin(), array.end(),6),  array.end() );

  • 相关阅读:
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    数据库路由中间件MyCat
    SQL Server 调用dll
    windows7 Sql server 2012 尝试读取或写入受保护的内存。这通常指示其他内存已损坏的修复
  • 原文地址:https://www.cnblogs.com/DLarTisan/p/7125890.html
Copyright © 2011-2022 走看看