• C++ 的erase和remove remove_if删除元素


    1. erase

      很多时候,我在删除vector元素的时候使用的是遍历指针,符合条件时使用erase删除,

    可是这样的使用办法会有个问题,在vec.erase(iter)后,需要使用erase的返回值,并且这个返回值是等价iter++,也就是iter的下一个元素,

    否则的话,iter将会是个无效指针

        vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) {
            if (*iter == 6){
                iter = vec_int.erase(iter);
            }
            else{
                ++iter;
            }
        }
        for (auto& i : vec_int)
        {
            printf("i = %d
    ", i);
        }

      可是从MSDN中看到erase并不是这么用的

       vector <int> v1;
       vector <int>::iterator Iter;
    
       v1.push_back( 10 );
       v1.push_back( 20 );
       v1.push_back( 30 );
       v1.push_back( 40 );
       v1.push_back( 50 );
    
       cout << "v1 =" ;
       for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
          cout << " " << *Iter;
       cout << endl;
    
       v1.erase( v1.begin( ) );
       cout << "v1 =";
       for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
          cout << " " << *Iter;
       cout << endl;
    
       v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
       cout << "v1 =";
       for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
          cout << " " << *Iter;

    output:

    v1 = 10 20 30 40 50
    v1 = 20 30 40 50
    v1 = 20 50

      MSDN中给出的用法是直接删除某一个或者一段的元素

    2.remove和remove_if

      实际使用中,删除指定元素更为准确的用法应该是使用remove和remove_if。

      bool isOdd(int value)
      {
        return (value % 2) == 1;
      }

      vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        vec_int.erase(remove_if(vec_int.begin(), vec_int.end(), isOdd), vec_int.end());
    
        for (auto& i : vec_int)    {
            printf("i = %d
    ", i);
        }
        vec_int.erase(remove(vec_int.begin(), vec_int.end(), 8));
    
        for (auto& i : vec_int)    {
            printf("i = %d
    ", i);
        }
    
        for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) {
            if (*iter == 6){
                iter = vec_int.erase(iter);
            }
            else{
                ++iter;
            }
        }
    
        for (auto& i : vec_int)    {
            printf("i = %d
    ", i);
        }
    output:
    i = 0 i = 2 i = 4 i = 6 i = 8 i = 0 i = 2 i = 4 i = 6 i = 0 i = 2 i = 4
    不同容器的迭代器的功能
    容器迭代器功能
    vector 随机访问
    deque 随机访问
    list 双向
    set / multiset 双向
    map / multimap 双向
    stack 不支持迭代器
    queue 不支持迭代器
    priority_queue 不支持迭代器
  • 相关阅读:
    virtualbox centos安装增强工具和问题详解
    Failed to load SELinux policy. Freezing
    .net mvc项目本地调试:浏览器一直转圈无法访问
    System.Security.Cryptography.CryptographicException: 出现了内部错误
    【SymmetricDS】实现新的数据库方言
    【SymmetricDS】SymmetricDS是如何工作的
    【Java】java.util.Objects 源码学习
    【Spring-web】AsyncRestTemplate源码学习
    【Spring-web】RestTemplate源码学习——梳理内部实现过程
    【Spring-web】RestTemplate源码学习
  • 原文地址:https://www.cnblogs.com/gongkiro/p/13228838.html
Copyright © 2020-2023  润新知