迭代器是比容器更高一级的抽象。
迭代器是一种类型,在程序中使用的是其对象。
set<int>::iterator sit; //set<int>::iterator是一个迭代器的类型。sit是一个迭代器的对象。
迭代器的概念
迭代器的类型
STL定义了5种迭代器,分别是:
随机访问迭代器(RandomAccessIterator)
//组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素
//组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素
双向迭代器(BidirectionalIterator)
//组合正向迭代器和逆向迭代器的功能,支持多遍算法
//组合正向迭代器和逆向迭代器的功能,支持多遍算法
前向迭代器(ForwardIterator)
//组合输入迭代器和输出迭代器的功能,并保留在容器中的位置
//组合输入迭代器和输出迭代器的功能,并保留在容器中的位置
输出迭代器(OutputIterator)
//向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算
法,同一输出迭代器不能两次遍历一个序列
//向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算
法,同一输出迭代器不能两次遍历一个序列
输入迭代器(InputIterator)
//从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算
法,同一个输入迭代器不能两遍遍历一个序列
//从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算
法,同一个输入迭代器不能两遍遍历一个序列
迭代器的层次结构
上面这图表并不是表明它们之间的继承关系:而只是描述了迭代器的种类和接口。处于图表下层的迭代器都是相对于处于图表上层迭代器的扩张集。例如:forward迭代器不但拥有input和output迭代器的所有功能,还拥有更多的功能。
7种容器迭代器的具体类型
7种容器迭代器中,vector和deque是随机访问迭代器,其他5种均为双向迭代器。所以vector和deque支持at和operator[]运算。而其他的不支持(map虽然也可以,但不是真的支持,还是用的查找的原理)
流迭代器
输出流迭代器
#include <iostream>
#include <iterator>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
using std::ostream_iterator;
int main(void){
vector<int> vecInt = {1, 2, 3, 4, 5, 6};
//创建vector
//创建vector
ostream_iterator
<int> osi(cout, “,”);
//创建输出流迭代器对象osi。把cout看成一个容器。元素之间以逗号进行分隔。
copy(vecInt.begin(), vecInt.end(), osi);
//输出:1,2,3,4,5,6, copy算法,将vecInt.begin()到vecInt.end()的数据放到osi
开始的容器中。
//输出:1,2,3,4,5,6, copy算法,将vecInt.begin()到vecInt.end()的数据放到osi
开始的容器中。
cout << endl;
return 0;
}
输入流迭代器
#include <iostream>
#include <iterator>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::istream_iterator;
using std::vector;
int main(void){
vector<int> vecInt;
istream_iterator
<int> isi(cin);
//创建输入流迭代器isi
copy(isi, istream_iterator<int>(), vecInt.begin());
//错误。从isi开始copy,临时对象istream_iterator<int>()表示结束。放到
vecInt.begin()的地方。出错是由于直接vetInt里面没有空间就直接放了。
//错误。从isi开始copy,临时对象istream_iterator<int>()表示结束。放到
vecInt.begin()的地方。出错是由于直接vetInt里面没有空间就直接放了。
copy(isi, istream_iterator<int>(),
back_inserter(vecInt)
);
//从isi开始copy,临时对象istream_iterator<int>()表示结束。在vecInt尾部添
加数据。
back_inserter(vecInt)
);
//从isi开始copy,临时对象istream_iterator<int>()表示结束。在vecInt尾部添
加数据。
for(auto & elem : vecInt)
//运行后,输入1 2 3 4 5 6 a 则输出:1 2 3 4 5 6
//运行后,输入1 2 3 4 5 6 a 则输出:1 2 3 4 5 6
cout << elem << ” “;
cout << endl;
return 0;
}
版权声明:本文为pengchengliu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。