文档章节

STL: iterator适配器(1).

SHIHUAMarryMe
 SHIHUAMarryMe
发布于 2016/08/14 00:07
字数 1066
阅读 18
收藏 0
点赞 0
评论 0

首先我们先从最简单的Iterator适配器来开始:

  • Insert(安插型)迭代器
template< class Container >
class insert_iterator;

std::insert_iterator::insert_iterator

//接受一个Container,和一个该容器的Iterator.
explicit insert_iterator( Container& c, typename Container::iterator i );
	

每次的插入操作相当于调用: c.insert(i, value);也就是说该容器必须支持insert操作.

接下来是std::insert_iterator支持的操作:

*iterator : 空操作, 内部实现为 return *this;

iter = value : 安插value 到构造函数指定的位置之前或者之后(之所以是之前或者之后,这个要看具体的container).其实也等价于 *iterator = value.

++iter : 空操作,内部实现为return *this;

iter++ : 空操作,内部实现为return *this;

  • Back_insert迭代器
template< class Container >
class back_insert_iterator;

std::back_insert_iterator::back_insert_iterator

explicit back_insert_iterator( Container& c );
	

相当于调用c.push_back(value); 这也就意味着我们的容器必须支持该操作.

接下来是std::back_insert_iterator支持的操作:

*iterator : 空操作, 内部实现为 return *this;

iter = value : 安插value 到构造函数指定的位置之前或者之后(之所以是之前或者之后,这个要看具体的container).其实也等价于 *iterator = value.

++iter : 空操作,内部实现为return *this;

iter++ : 空操作,内部实现为return *this;

  • Front_insert迭代器
template< class Container >
class front_insert_iterator;

 std::front_insert_iterator::front_insert_iterator

explicit front_insert_iterator( Container& c );

每次插入操作其实就是调用c.front_insert(value);也就是说我们给定的Container必须支持front_insert操作.

接下来是std::front_insert_iterator支持的操作:

*iterator : 空操作, 内部实现为 return *this;

iter = value : 安插value 到构造函数指定的位置之前或者之后(之所以是之前或者之后,这个要看具体的container).其实也等价于 *iterator = value.

++iter : 空操作,内部实现为return *this;

iter++ : 空操作,内部实现为return *this;

Demo

#include <iostream>
#include <vector>
#include <forward_list>
#include <iterator>

int main()
{
	std::forward_list<int> f_list;
	std::front_insert_iterator<std::forward_list<int>> f_insert(f_list);
	for (int i = 0; i < 10; ++i) {
		*f_insert = i;
		++f_insert;
	}

	for (const int& value : f_list) {
		std::cout << value << " ";
	}
	std::cout << std::endl;

	std::vector<int> vec;
	std::insert_iterator<std::vector<int>> insert(vec, vec.begin());
	for (int i = 0; i < 10; ++i) {
		*insert = i;
		++insert;
	}

	for (const int& value : vec) {
		std::cout << value << " ";
	}
	std::cout << std::endl;

	return 0;
}

Stream(串流)迭代器:

Stream迭代器是一种迭代器适配器,借用它,你可以把stream当成算法的来源端和目的端。更明确地说,一个istream迭代器可以用来从input istream读取元素,而一个ostream迭代器可以用来对output stream写入元素.

std::ostream_iterator

template< class T,
          class CharT = char,
          class Traits = std::char_traits<CharT>>
class ostream_iterator;

std::ostream_iterator::ostream_iterator

ostream_iterator(ostream_type& stream, const CharT* delim)
	 	
ostream_iterator(ostream_type& stream)

其支持的操作:

*iterator : 空操作,其内部实现为return *this;

iterator = value : 将value的值写到ostream中去: ostream<<value.

++iterator : 空操作,内部实现为: return *this;

iterator++ : 空操作,其内部实现为return *this;

--------------------------------我是分割线-----------------------------------------

std::istream_iterator

template< class T,
          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator;

std::istream_iterator::istream_iterator

istream_iterator();

constexpr istream_iterator(); //(since C++11, only if T is literal type)

istream_iterator( istream_type& stream );
	
istream_iterator( const istream_iterator& other ) = default;

其支持的操作:

其中特别需要注意的是->和*操作.

const T& operator*() const;
	
const T* operator->() const;

*iter : 返回之前读取的值(如果构造函数并未立刻读取一个值,则本次执行读取任务).

iter->member : 返回之前读取的元素的成员.

++iter : 读取下一个值,并返回该值的位置.

iter++ : 返回下前一个读取位置,读取下一个值.

iter1 == iter2 : 检查iter1 和 iter2是否相等.

iter1 != iter2 : 检查iter1 和 iter2是否不等.

建立std::istream_iterator的时候,你必须提供一个input stream 作为实参,迭代器将从其中读取数据。然后它便经由input stream 的寻常接口,使用operator>>读取元素。但是读取动作有可能失败(可能读取到文件尾部,也可能读取错误),此外算法的数据来源端也需要一个终点,为了解决这个 问题我们可以使用一个名为: end of stream迭代器他以std::istream_iterator的default构造函数产出. std::istream_iterator只要有任何一次读取失败,就会变成 end of stream迭代器。

Demo for std::istream_iterator and std::ostream_iterator

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

int main()
{
	std::ostream_iterator<int> intPrint(std::cout, "\n");
	*intPrint = 20;

	std::istream_iterator<int> writeInt(std::cin);
	std::istream_iterator<int> writeEOF;
	while (writeInt != writeEOF) {
		std::cout << "value: " << *writeInt << std::endl;
		++writeInt;
	}

	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
SHIHUAMarryMe
粉丝 12
博文 165
码字总数 138772
作品 0
武汉
程序员
C++ STL编程轻松入门 5

2.2.3 第三版:唯美主义的杰作   事态的发展有时候总会趋向极端,这在那些唯美主义者当中犹是如此。首先声明,我并不是一个唯美主义者,提供第二版程序的改进版,完全是为了让你更深刻的感...

暖冰
2015/11/21
0
0
C++语言学习之STL 的组成

STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件。通俗的讲: 容器:装...

杨坤乾
2014/02/11
0
0
C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用。很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率。这篇博客在简单介绍STL的情况下...

chenyufeng1991
2016/08/21
0
0
STL list链表的用法详解

------------------------------------------------------------------------------- 原来... STL list链表的用法详解 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通...

nao
2014/04/10
0
0
STL,ATL,WTL之间的联系和区别

STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它...

AlphaJay
2010/06/28
0
0
STL,ATL,WTL的联系与区别

STL,ATL,WTL的联系与区别 STL 即 Standard Template Library STL(标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时...

IMGTN
2012/06/04
0
0
篮子、水果和鸡蛋——关于C++的模板偏特化和萃取编程技法

最近在读《STL源码剖析》。读这本书的时候发现自己的C++的知识其实是非常匮乏的。 从大学的C++教材上学到一些C++基本的语法、内存管理、继承、多态等方面的基础知识。这些只是是一棵大树的根...

costaxu
2012/12/22
0
0
Error list iterator not incrementable

Container Traverse for(iterator it = begin(); it != end(); ++it) for(iterator it = begin(); it != end(); it++) 两种方式iterator遍历的次数是相同的,但在STL中效率不同,前++--返回引......

nao
2014/04/11
0
0
STL vector 介绍连载1-2-3

STL简介: STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。这可能是...

天远
2012/05/20
0
0
C++ Primer 学习笔记(第三章:字符串、向量和数组)

C++ Primer 学习笔记(第三章:字符串、向量和数组) [TOC] 3.1 命名空间的声明 声明语句可以一行放多条。 位于头文件的代码,一般来说不应该使用声明。因为其内容会拷贝到每个使用该头文件的...

ShawnLue
2015/08/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部