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

posted @ 2018-09-21 07:03  小石王  阅读(649)  评论(0编辑  收藏  举报