插入迭代器
-
定义
①.概念
插入器是一种迭代器适配器,它接受一个容器,生成一个迭代器,能实现向给定容器添加元素。
②.头文件
插入迭代器定义在头文件 iterator 中。
-
back_inserter
①.概念
back_inserter 创建一个使用 push_back 的迭代器。
②.迭代器赋值
直接给迭代器赋值即可给绑定的容器插入元素。
③.其他操作
支持 *iter、iter++、++iter 的操作,但是对 iter 不会做任何事情,都是返回的 iter。
vector<int> iv;
auto it = back_inserter(iv);//创建一个插入器
*it = 1;
it++;
*it = 2;
++it;
*it = 3;
it = 4;
//当前 iv 中的元素为 1,2,3,4
④.算法中应用
back_inserter 可以作为算法中的目的位置来使用。
vector<int> iv;
fill_n(back_inserter(iv),10,0);//添加10个元素到vec
如上的算法中,相当于每次调用 push_back 来插入元素。
-
front_inserter
①.概念
front_inserter 创建一个使用 push_front 的迭代器。
②.迭代器赋值
直接给迭代器赋值即可给绑定的容器插入元素。
③.其他操作
同 back_inserter ,也 支持 *iter、iter++、++iter 的操作,但是对 iter 不会做任何事情,都是返回的 iter。
④.算法中应用
front_inserter 可以作为算法中的目的位置来使用。
list<int> lst = {1,2,3,4};
list<int> lst2;
copy(lst.cbegin(),lst.cend(),front_inserter(lst2));//
-
inserter
①.概念
inserter 创建一个使用 insert 操作的迭代器,需要提供第二个参数,必须是指向给定容器的迭代器,元素将插入到该元素之前。
②.迭代器赋值
直接给迭代器赋值即可给绑定的容器插入元素。
③.其他操作
同 back_inserter ,也 支持 *iter、iter++、++iter 的操作,但是对 iter 不会做任何事情,都是返回的 iter。
④.算法中应用
inserter 可以作为算法中的目的位置来使用。
list<int> lst = {1,2,3,4};
list<int> lst2;
copy(lst.cbegin(),lst.cend(),inserter(lst2,lst2.begin()));//
不同与 front_inserter 每次都是在开头添加元素,会使插入的元素顺序颠倒,inserter 执行插入操作后会使使原来的迭代器后移指向新的位置,即指向的元素始终不变,不会操作元素顺序颠倒。
流迭代器
-
定义
①.概念
类似容器的操作,标准库也为输入输出流定义了迭代器,这些迭代器将他们对应的流当作一个特定类型的元素序列来处理;通过使用迭代器可以用泛型算法来操作流数据。
②.头文件
流迭代器定义在头文件 iterator 中。
-
输入流迭代器
①.概念
输入流迭代器绑定到一个输入流对象,从流中读取指定类型的元素,直到遇到文件尾或者错误为止。
②.定义输入流迭代器
定义一个输入流迭代器必须指定要读取的数据类型、和绑定的流对象。
istream_iterator<int> int_it(cin);//从 cin 读取 int 类型元素 istream_iterator<int> int_eof;//尾后迭代器 vector<int> vec; while( int_it != int_eof) vec.push_back(*int_it++); //等价于以下操作 vector<int> iv(int_it,int_eof)//从迭代器范围构造
②.使用算法操作流迭代器
可以像容器中定义的迭代器一样使用算法操作流迭代器
istream_iterator<int> in(cin),eof; cout << accumulate(in,eof,0) << endl;
-
输出流迭代器
①.概念
输出流迭代器绑定到一个输出流,可以对任何具有输出运算符的类型定义 ostream_iterator。
②.定义输出流迭代器
定义一个输出流迭代器必须指定要输出的数据类型、和绑定的流对象。
ostream_iterator<int> out_iter(cout," ");//将 int 类型的数据写入输出流 cout,每个元素后输出 " "
③.输出流操作
可以直接给输出流迭代器赋值来将数据写入到输出流对象中。*out、++out、out++ 不对 out 做任何事情,都返回 out。
④.使用算法
使用迭代器操作流对象可以方便的使用泛型算法。