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