STL: iterator适配器(1).
STL: iterator适配器(1).
SHIHUAMarryMe 发表于2年前
STL: iterator适配器(1).
  • 发表于 2年前
  • 阅读 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;
}

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 12
博文 166
码字总数 138736
×
SHIHUAMarryMe
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: