标准库 插入迭代器 详解

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

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

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

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

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

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

三种插入迭代器

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

inserter的特殊之处:

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

例子:

  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4. #include <algorithm>
  5. using namespace std;
  6. int main(){
  7. //copy函数不会改变容器的大小,但是使用了插入迭代器后,
  8. //就会改变容器的大小了
  9. /*
  10. list<int> lst{1,2,3,4};
  11. list<int> lst2,lst3;
  12. //运行错误,因为lst2是空list,copy函数不会增加容器的大小
  13. //copy(lst.cbegin(), lst.cend(), lst2.begin());
  14. //结果:4,3,2,1
  15. copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
  16. //结果:1,2,3,4
  17. copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
  18. for(auto const &s : lst2){
  19. cout << s << " ";
  20. }
  21. cout << endl;
  22. for(auto const &s : lst3){
  23. cout << s << " ";
  24. }
  25. cout << endl;
  26. */
  27. //unique_copy 拷贝不重复的元素到新的容器
  28. vector<int> ivec{1,2,1,2,3,4,3,3,3,2,2,1,1,1};
  29. list<int> lst;
  30. sort(ivec.begin(),ivec.end());
  31. unique_copy(ivec.cbegin(), ivec.cend(),back_inserter(lst));
  32. for(auto const &s : lst){
  33. cout << s << " ";
  34. }
  35. cout << endl;
  36. }

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

本人微信:xiaoshitou5854

c/c++ 标准库 插入迭代器 详解的更多相关文章

  1. c/c++ 标准库 bind 函数 详解

    标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参 ...

  2. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是 ...

  3. C++标准库vector类型详解

    Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...

  4. 标准库bufio个人详解

    本文是我有通俗的语言写的如果有误请指出. 先看bufio官方文档 https://studygolang.com/pkgdoc文档地址 主要分三部分Reader.Writer.Scanner 分别是读 ...

  5. 黑马----JAVA迭代器详解

    JAVA迭代器详解 1.Interable.Iterator和ListIterator 1)迭代器生成接口Interable,用于生成一个具体迭代器 public interface Iterable ...

  6. 【Solr】索引库查询界面详解

    目录 索引库查询界面详解 回到顶部 索引库查询界面详解 q:主查询条件.完全支持lucene语法.还进行了扩展. fq:过滤查询.是在主查询条件查询结果的基础上进行过滤.例如:product_pric ...

  7. 全网最全的Windows下Python2 / Python3里正确下载安装用来向微信好友发送消息的itchat库(图文详解)

    不多说,直接上干货! 建议,你用Anaconda2或Anaconda3. 见 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装用来向微信好友发送消息的itchat库( ...

  8. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  9. 【Linux开发】Linux下jpeglib库的安装详解

    Linux下jpeglib库的安装详解 首先要下载所需的库压缩包:jpegsrc.v6b.tar.gz或 jpegsrc.v8b.tar.gz 然后将下载的压缩包随便放在和解压到你喜欢的地方. # t ...

随机推荐

  1. Linux下FTP虚拟账号环境部署总结

    vsftp的用户有三种类型:匿名用户.系统用户.虚拟用户.1)匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous.2)本地用户登录:使用系统用户登录,在/etc/passwd中 ...

  2. 使用Eclipse创建SpringBoot项目

    1  首先我们需要安装STS插件:Help--> Eclipse Marketplace 安装成功之后,会让你重启eclipse. 2  然后 File-->New--->Proje ...

  3. C# 通过java生成的RSA公钥加密和解密

    最近工作需要将对方公司生成的RSA加密公钥进行明文加密和解密,发现了几点贴出来做个笔记. RSA单次加密是有长度限制!微软封装的加密方法如果出现长度超出指定范围的话报错是直接报“该项不适于在指定状态下 ...

  4. SpringBoot(10) Servlet3.0的注解:自定义原生Servlet、自定义原生Listener

    一.自定义原生Servlet 1.启动类里面增加注解 @ServletComponentScan 2.Servlet上添加注解  @WebServlet(name = "userServle ...

  5. UnicodeDecodeError: 'ascii' codec can't decode byte

    这个问题遇到过很多次了,但是每次都没记住,用完就忘了,这次记录下. 通过关键词谷歌一下: 解决方案: # encoding=utf8 import sys reload(sys) sys.setdef ...

  6. advanced installer重新打包教程

    一.简介 本次利用Advanced Installer软件里的Repackager重封装工具进行测试制作MSI安装包,还开可以利用Advanced Installerr制作MSI安装包 原理为执行两次 ...

  7. Hystrix降级逻辑中如何获取触发的异常

    通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...

  8. [转]php hash_pbkdf2 和 node.js crypto.pbkdf2

    http://php.net/manual/en/function.hash-pbkdf2.php https://nodejs.org/api/crypto.html#crypto_crypto_p ...

  9. Spring Day 2

    **Spring框架的IOC之注解方式的快速入门** 步骤一:导入注解开发所有需要的jar包 步骤二:创建对应的包结构,编写Java的类:接口到实现类 步骤三:在src的目录下,创建applicati ...

  10. 从零开始学安全(二十七)●利用Nmap对防火墙,IDS,IPS 进行欺骗

    先介绍什么是防火墙 ids 并联  ips 串联 来看我们nmap 命令