迭代器类别

名称 定义
插入迭代器 这些迭代器被绑定到一个容器上,可用来向容器插入元素
流迭代器 这些迭代器被绑定到输入或输出流上,可用来遍历所有关联的IO流
反向迭代器 这些迭代器向后而不是向前移动。除了forward_list之外的标准库容器都有反向迭代器
移动迭代器 这些专用的迭代器不是拷贝其中的元素,而是移动它们

1. 插入器的三种类型

名称 定义
back_inserter 创建一个使用push_back的迭代器
front_inserter 创建一个使用push_front的迭代器
inserter 创建一个使用insert的迭代器。此函数接受第二个参数,这个参数必须是一个指向给定容器的迭代器。元素将插入到给定迭代器所表示的元素之前。

eg.

vector<int> foo = { 1,2,3 };
auto it = inserter(foo, foo.end());
*it = 4;//foo 1,2,3,4deque<int> di, dbi, dfi;
copy(foo.begin(), foo.end(), inserter(di, di.begin())); // 接收两个参数
copy(foo.begin(), foo.end(), back_inserter(dbi));
copy(foo.begin(), foo.end(), front_inserter(dfi));for_each(di.begin(), di.end(), [](const int& a) {std::cout << a << ";"; });
for_each(dbi.begin(), dbi.end(), [](const int& a) {std::cout << a << ";"; });
for_each(dfi.begin(), dfi.end(), [](const int& a) {std::cout << a << ";"; });

front_inserter的操作类似于back_inserter:该函数将创建一个迭代器,调用它所关联的基础容器的push_front成员函数代替赋值操作。

注意:只有当容器提供push_front操作时,才能使用front_inserter。在vector或其他没有push_front运算的容器上使用front_inserter,将产生错误。

2. 流迭代器

  • istream_iterator
    读取输入流,任何已定义输入操作符(>>操作符)的类型都可以定义istream_iterator。
  • ostream_iterator
    向一个输出流写数据,任何已定义输出操作符(<<操作符)的类型也可以ostream_iterator。
    通过流迭代器,可用泛型算法对流对象操作:读取和写入数据。

2.1 istream_iterator

流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。此外,可比较两个istream迭代器是否相等(或不等),而ostream迭代器则不提供比较运算。

操作 定义
it1 == it2 比较两个istream_iterator是否相等(不等)。迭代器读取的必须是 相同的类型。如果两个迭代器都是end值,则它们相等。
it1 != it2 指向流结束位置的迭代器,如果它们使用同一个输入流构造,则它们相等
*it 返回从流中读取的值
it->mem 是(*it).mem的同义词。返回从流中读取的对象的mem成员
++it 通过使用元素类型提供的>>操作符从个输入流中读取下一个元素值, 使迭代器向前移动。通常,前缀版本使迭代器在流中向前移动,并返 回对加1后的迭代器的引用
it++ 而后缀版本使迭代器在流中向前移动后,返回原值

eg.

     /* 定义输入流迭代器* 只有键入ctrl+d结束输入后,后两句方可执行。        */istream_iterator<int> in_iter(std::cin);istream_iterator<int> eof; vector<int> vec;// 输入流迭代器作为参数给vector容器赋值vector<int> vec2(in_iter, eof);while (in_iter != eof)vec.push_back(*in_iter++);vector<int>::const_iterator it = vec.begin();for (; it != vec.end(); ++it)cout << *it << endl; //算法操作istream_iterator<int> eof;istream_iterator<int> in(cin);cout << accumulate(in, eof, 0) << endl;
  • istream_iterator使用懒惰读取。用之前不能销毁。

2.2 ostream_iterator

操作 定义
ostream_iterator out(os) out将类型为T的值写到输出流os中
ostream_iterator out(os, d) out将类型为T的值写到输出流中,每个值后面都输出一个d。d指向一个空字符结尾的字符数组
out = val 用<<运算符将val写到out所绑定的ostream中。val的类型必须与out可写的类型兼容
ostream_iterator out(os, d) ++out,out++ 使用元素类型所定义的>>运算符从输入流中读取下一个值
ostream_iterator<string> out_iter(cout, "/n");
istream_iterator<string> in_iter(cin), eof;
while (in_iter != eof)*out_iter++ = *in_iter++;
return 0;std::ostream_iterator<int> iter_out(std::cout, " ");  // 每个数据输出后都输出一个空格
std::vector<int> vec = { 1, 3, 5 };
for (auto i : vec)*iter_out++ = i;    // i被写入到cout中for (auto i : vec)iter_out = i;    // 此语句和上面等价,因为*和++实际上不对iter_out做任何事情
std::cout << std::endl;std::ostream_iterator<int> iter_out(std::cout, " ");    // 每个数据输出后都输出一个空格
std::vector<int> vec = { 1, 3, 5 };
copy(vec.begin(), vec.end(), iter_out);

3. 反向迭代器

cbegin() //第一个字符
crbegin() //最后一个字符
cend()//最后一个字符的下一个
crend()//第一个字符的前一个

  • 流不支持反向迭代器

C++ Primer 5th笔记(10)chapter10 泛型算法 :迭代器相关推荐

  1. C++ Primer 学习笔记 第十章 泛型算法

    C++ Primer 学习笔记 第十章 泛型算法 336 find函数 #include <iostream> #include <vector> #include <s ...

  2. Java笔记05-Collection、泛型、迭代器

    Java笔记05-Collection.泛型.迭代器 [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 ...

  3. C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构

    名称 定义 输入迭代器 只读,不写:单遍扫描,只能递增 输出迭代器 只写,不读:单遍扫描,只能递增 前向迭代器 可读写,多遍扫描,只能递增 双向迭代器 可读写,多遍扫描,可递增递减 随机访问迭代器 可 ...

  4. C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构

    除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器.这些迭代器包括以下几种. 插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可用来向容 ...

  5. C++ primer 第10章 泛型算法

    文章目录 概述 find count 初识泛型算法 只读算法 只读算法accumulate 只读算法equal 写容器元素的算法 算法fill 算法fill_n back_inserter 算法cop ...

  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符

    1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...

  7. C++ Primer 5th笔记(10)chapter10 泛型算法 :write

    1. fill: 对给定区间全部赋予某值(algorithm.h) 将指定范围内的每个元素都设定为给定的值.如果输入范围有效,则可以安全写入.这个算法只会对输入范围内已存在的元素进行写入操作. tem ...

  8. C++ Primer 5th笔记(10)chapter10 泛型算法 : read

    标准库提供一组不依赖特定的容器类型的共性算法 指定迭代器范围, eg. [begin, end)这种左闭包 3种类型: 只读.写.sort 1. find 查询 template<class I ...

  9. C++ Primer 5th笔记(10)chapter10 泛型算法 :谓词

    1. 定义 谓词(predicate)是一个可调用的表达式,返回结果是一个能用作条件的值. 用于一个对象或一个表达式,如果可以对其使用调用运算符,则称为可调用的: 可调用的对象有:函数.函数指针.重载 ...

最新文章

  1. 线性回归算法原理简介
  2. 猫哥教你写爬虫 006--条件判断和条件嵌套
  3. 读书几年收藏的编程利器网站,给大家分享出来
  4. SharePoint 2013 - Sideloading
  5. Spring Boot 扩展点应用之工厂加载机制
  6. 泰山挑夫1(菜鸟题解)
  7. TextBlock or Label?
  8. Jenkins持续集成之小试牛刀
  9. c语言大作业:员工工资管理系统
  10. vr全景图制作软件都有哪些?
  11. 上传图片时出现http 415错误
  12. 1013: 求两点间距离(C语言)
  13. 天上的街市Unity游戏场景制作案例(一)
  14. 名帖157 王徽之 行楷《新月帖》
  15. cesium 根据SampledPositionProperty与timeline实现轨迹回放功能(跟随视角、上帝视角) 详细代码与理解记录
  16. pccs色卡_PCCS色卡RGBCMYK對照表.PDF
  17. IDEA插件系列(77):Spec Math symbols插件——数学符号
  18. css实现文字中间横线,css实现文字居中两边横线效果的示例代码
  19. windows装android软件,电脑上运行安卓软件WindowsAndroid如何成功安装
  20. 天禾云,校园云盘内部结构安全性/权限设置的剖析

热门文章

  1. 【Python】青少年蓝桥杯_每日一题_5.09_画三角形和六边形
  2. java强制编译通过_强制java使用用户输入作为消息进行编译错误
  3. css 盒子有内容 盒子往下掉_css盒子模型与文本溢出学习笔记
  4. cgi web 调用多次启动_简单说明CGI和动态请求是什么
  5. 我用hbuilder怎么用不了jquery_【权益资讯】机房电脑用不了怎么办
  6. 上海一百多个数据中心每年消耗全市1.6%的电,将优胜劣汰
  7. 数据中心UPS电源节能降耗的四大原则
  8. 谷歌数据中心采用机器人销毁硬盘驱动器
  9. 数据中心的运维管理原则(一)
  10. 风口再起:数据中心建设