1.STL iterator迭代器
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>
目录
1.1 迭代器的基本概念
迭代器相当于指向容器元素的指针,它在容器内可以向前移动,也可以做向前或向后双向移动。有专为输入元素准备的迭代器,有专为输出元素准备的迭代器,还有可以进行随机操作的迭代器,这为访问容器提供了通用方法。
迭代器扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。
1.2 迭代器的类型
迭代器的类型可分为:输出迭代器,输入迭代器,前向迭代器,双向迭代器,随机迭代器。
迭代器 | 功能 | 描述 |
---|---|---|
输入迭代器 | 提供对数据的只读访问 | 只读,支持++、==、!= |
输出迭代器 | 提供对数据的只写访问 | 只写,支持++ |
前向迭代器 | 提供读写操作,并能向前推进迭代器 | 读写,支持++、==、!= |
双向迭代器 | 提供读写操作,并能向前和向后操作 | 读写,支持++、–, |
随机访问迭代器 | 提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 | 读写,支持++、–、[n]、-n、<、<=、>、>= |
1.2.1 输出迭代器
输出迭代器只用于写一个序列,它可以进行递增和提取操作。
代码示例:
vector<int> intVect;
for (int i = 0; i < 10; i++)
{
intVect.push_back(i);
}
cout << "Vect:" << endl;
vector<int>::iterator it = intVect.begin();
while (it != intVect.end())
cout << *it++ << endl;
1.2.2 输入迭代器
输入迭代器只用于读一个序列,它可以进行递增、提取和比较操作。
代码示例如下:
vector<int> intVect(5);
vector<int>::iterator In = intVect.begin();
*In++ = 1;
*In++ = 3;
*In++ = 5;
*In++ = 7;
*In = 9;
cout << "Vect:";
vector<int>::iterator it = intVect.begin();
while (it != intVect.end())
{
cout << *it++ << ' ';
}
cout << endl;
1.2.3 前向迭代器
前向迭代器可以用于读,也可以用于写,它不仅具有输入和输出迭代器的功能,还具有保存其值的功能,从而能够从迭代器原来的位置开始重新遍历序列。
实例代码如下:
vector<int> intVect(5);
vector<int>::iterator it = intVect.begin();
vector<int>::iterator saveit = it;
*it++ = 2;
*it++ = 4;
*it++ = 6;
*it++ = 8;
*it = 10;
cout << "Vect:";
while (saveit != intVect.end())
cout << *saveit++ << ' ';
cout << endl;
1.2.4 双向迭代器
双向迭代器既可以用于读,也可以用于写,它与前向迭代器类似,只是双向迭代器可以做递增和递减操作。
代码示例如下:
vector<int> intVect(5);
vector<int>::iterator it = intVect.begin();
vector<int>::iterator saveit = it;
*it++ = 1;
*it++ = 3;
*it++ = 5;
*it++ = 7;
*it = 9;
cout << "Vect:";
while (saveit != intVect.end())
cout << *saveit++ << ' ';
cout << endl;
do
{
cout << *--saveit << endl;
} while (saveit!= intVect.begin());
cout << endl;
1.2.5 随机迭代器
随机访问迭代器是最强大的迭代器类型,不仅具有双向迭代器的所有功能,还能使用指针的算术运算和所有比较算法。
代码示例如下:
vector<int> intVect(5);
vector<int>::iterator it = intVect.begin();
*it++ = 1;
*it++ = 3;
*it++ = 5;
*it++ = 7;
*it = 9;
cout << "Vect:";
for (it = intVect.begin(); it != intVect.end(); it++)
{
cout << *it << ' ';
}
it = intVect.begin();
*(it + 2) = 100;
cout << endl;
cout << "Vect :";
for (it = intVect.begin(); it != intVect.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
1.3 STL 容器那些支持迭代
容器 | vector | deque | list | set/multiset | map.multimap | stack | queue | priority_queue |
是否支持迭代器 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 |