任何东西,只要其行为类似迭代器,它就是一个迭代器,标准库提供了数个预定义的特殊迭代器,也叫做迭代器适配器。使用前需要加上 #include<iterator> 1,Insert iterator安插型迭代器 2,Stream iterator串流迭代器 3,Reverse itreator逆向迭代器 4,Move iterator搬移迭代器
安插型迭代器可以将算法以安插的方式运行而不是覆写。,它会将容器的大小,按需修改,共分为三类: 1,Back_inserter(安插在容器最末端) 2,Front_inserter(安插在容器最前端) 3,Inserter
Back_inserter支持所有的序列式容器(所有序列式容器支持push_back())
list<int> m_list = {1,2,3,4,5,6,7,8,9,10,0}; vector<int> m_vector; copy(m_list.cbegin(), m_list.cend(),back_inserter(m_vector));Front_inserter只支持双向序列式容器,也就是有push_front()的如deque,list等。
list<int> m_list = {1,2,3,4,5,6,7,8,9,10,0}; list<int> m_list2; copy(m_list.cbegin(), m_list.cend(), front_inserter(m_list2));Inserter支持所有的容器,包含序列容器,关联容器以及无序容器。它内部调用insert(),序列容器默认为后插,而关联容器为保证顺序,安插的次序与排序的次序是不同的。
list<int> m_list = {1,2,3,4,5,6,7,8,9,10,0}; set<int> m_set = {}; unordered_set<int> m_unordered_set; copy(m_list.cbegin(), m_list.cend(),inserter(m_set, m_set.begin()));//out:0 1 2 3 4 5 6 7 8 9 10串流迭代器被用来读写steam,使得来自键盘的输入像是一个集合,可以从中读取内容也可以把一个算法的输出结果重定向到文件或者屏幕。
vector<int> m_vector; copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(m_vector)); sort(m_vector.begin(),m_vector.end()); unique_copy(m_vector.cbegin(),m_vector.cend(),ostream_iterator<int>(cout,"-"));istream_iterator可从cin读取该类型的元素,istream_iterator()的默认构造函数产生一个代表串流结束符的迭代器。 ostream_iterator将该类型的元素通过cout输出第二个参数为分隔符。
Reverse itreator会造成算法的逆向操作,所有双向的或者支持随机访问的容器均支持。通过成员函数 rbegin(),rend(),crbegin(),crend()产生逆向迭代器
vector<int> m_vector = {1,2,3,4,5,6}; copy(m_vector.crbegin(),m_vector.crend(),ostream_iterator<int>(cout," "));Move iterator将所有对于底层元素的处理转换为一个move操作。
vector<int> m_vector = {1,2,3,4,5,6}; vector<int> m_vector2(make_move_iterator(m_vector.begin()), make_move_iterator(m_vector.end()));