zoukankan      html  css  js  c++  java
  • c/c++ 标准库 插入迭代器 详解

    标准库 插入迭代器 详解

    插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的。

    例如下面的代码就是错误的:

    list<int> lst{1,2,3,4}; 
      list<int> lst2,lst3;
    copy(lst.cbegin(), lst.cend(), lst2.begin());
    

    lst2是个空的容器,copy函数不能扩容容器lst2,所以会发生运行时错误。

    用插入迭代器就可以很好的解决上面的问题

    list<int> lst{1,2,3,4}; 
      list<int> lst2,lst3;
    copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
    

    三种插入迭代器

    迭代器 功能描述
    back_inserter 创建一个使用push_back的迭代器
    front_inserter 创建一个使用push_front的迭代器
    inserter 创建一个使用insert的迭代器,元素插入到指定位置之前

    inserter的特殊之处:

    //假设it是有inserter生成的迭代器
    *it = val;//其效果同下面二行代码一样
    it = c.insert(it, val);//it指向新加入的元素
    ++it;//递增it,使它指向原来的元素
    
    

    例子:

    #include <iostream>
    #include <vector>
    #include <list>
    #include <algorithm>
    
    using namespace std;
    
    int main(){
      //copy函数不会改变容器的大小,但是使用了插入迭代器后,                        
      //就会改变容器的大小了                                                        
      /*                                                                            
      list<int> lst{1,2,3,4};                                                       
      list<int> lst2,lst3;                                                          
      //运行错误,因为lst2是空list,copy函数不会增加容器的大小                       
      //copy(lst.cbegin(), lst.cend(), lst2.begin()); 
      //结果:4,3,2,1
      copy(lst.cbegin(), lst.cend(), front_inserter(lst2));         
      //结果:1,2,3,4                
      copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));                 
      for(auto const &s : lst2){                                                    
        cout << s << " ";                                                           
      }                                                                             
      cout << endl;                                                                 
      for(auto const &s : lst3){                                                    
        cout << s << " ";                                                           
      }                                                                             
      cout << endl;                                                                 
      */
    
      //unique_copy 拷贝不重复的元素到新的容器                              
      vector<int> ivec{1,2,1,2,3,4,3,3,3,2,2,1,1,1};
      list<int> lst;
      sort(ivec.begin(),ivec.end());
      unique_copy(ivec.cbegin(), ivec.cend(),back_inserter(lst));
      for(auto const &s : lst){
        cout << s << " ";
      }
      cout << endl;
    
    }
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    求24点
    关于参数和返回值的常量性
    点到平面的距离公式
    大端序与小端序
    Quake3中的绝对值函数
    整数超出范围时如何表示?
    关于数组的几道面试题
    在移位数组中查找数
    时间复杂度O(n),空间复杂度O(1)的排序
    C++之对象切割
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/9684515.html
Copyright © 2011-2022 走看看