函数对象实现和迭代器
[@more@]12.3.6 实现函数对象
自定义函数对象的三种形式:
1. 函数对象类定义的最简单形式包含一个被重载的函数调用操作符。
2. 引入一个数据成员来存储被比较的值以及一个构造函数,把这个成员初始化为用户指定的值。
3. 不使用构造函数它根据被比较的值对类参数化。
12.4 回顾iterator
const 容器只能被绑定在const iterator 上,这样的要求与const 指针只能指向const 数组的
行为一样。
12.4.1 插入iterator
标准库定义一组三个插入iterator 的适配器函数,它们返回特定的插入iterator:
(1)back_inserter() 它使用容器的push_back()插入操作代替赋值操作符back_inserter()
的实参是容器自己
(2) front_inserter() 它使用容器的push_front()插入操作代替赋值操作符front_inserter()
的实参也是容器自己。注意:vector不支持push_front方法
(3)inserter() 它调用容器的insert()插入操作代替赋值操作符。inserter()要求两个实参
容器本身以及它的一个iterator 指示起始插入的位置。
12.4.2 反向iterator
1. begin()和end()操作分别返回指向容器的首元素和容器的末元素下一位置的iterator。
2. 返回一个反向iterator 也是有可能的,一个从末元素到首元素遍历容器的iterator ,对所有容器类型都能支持这种能力的操作是rbegin()和rend()。
3. 与前向iterator 一样它有const 和非const两种实例
12.4.3 iostream iterator
标准库为输入和输出iostream 的iterator 提供了支持,它们可以与标准库容器类型和泛
型算法结合起来工作。
1. istream_iterator 类支持在一个istream 或其派生类如ifstream 输入文件流上的iterator 操作。
2.ostream_iterator 类支持在一个ostream 或其派生类如ofstream 输出文件流上的iterator 操作
注意:为了使用这两种iterator 我们必须包含iterator 头文件#include
例如:
istream_iterator< int > input( cin );
istream_iterator< int > end_of_stream;
vector vec;
copy ( input, end_of_stream, inserter( vec, vec.begin() ));
sort( vec.begin(), vec.end(), greater() );
ostream_iterator< int > output( cout, " " );
unique_copy( vec.begin(), vec.end(), output );
12.4.4 istream_iterator
一般形式声明一个istream_iterator:
istream_iterator identifier( istream& );
例如:
// 从命名的文件中读入一个字符串序列
ifstream infile( "C++Primer" );
istream_iterator< string > is_string( infile );
开始位置:用一个istream 对象初始化的istream_iterator
结束位置:使用istream_iterator 缺省构造函数。例如:istream_iterator< string > end_of_stream;
例如:
vector text;
// Ok: 提供 iterator 对
copy( is_string, end_of_stream, inserter( text, text.begin() ));
12.4.5 ostream_iterator
用下列两种形式之一可以声明ostream_iterator:
ostream_iterator identifier( ostream& )
ostream_iterator identifier( ostream&, char* delimiter )
说明:
(1)Type 表示任意一个已定义了输出操作符operator>> 的内置或用户定义的类型。
(2) delimiter 表示一个C 风格字符串它被输出到文件的每个元素后面,因为它是一个C 风格字符串所以它必须有空终止符。
(3) ostream实参可以是一个实际的ostream 类对象,如cout 或任意公有派生的ostream 子类型如ofstream。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/32405/viewspace-927841/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/32405/viewspace-927841/