STL: iterator适配器(1).

首先我们先从最简单的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;
}

 

转载于:https://my.oschina.net/SHIHUAMarryMe/blog/732309

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值