一入门: stl速览
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。
1.1 头文件和名字空间
为了避免和其他头文件冲突, STL的头文件不再使用常规的.h扩展。
表
1. STL
头文件和容器类
#include
|
Container Class
|
<deque>
|
deque
|
<list>
|
list
|
<map>
|
map, multimap
|
<queue>
|
queue, priority_queue
|
<set>
|
set, multiset
|
<stack>
|
stack
|
<vector>
|
vector, vector<bool>
|
为了使用STL,可以将下面的指示符插入到你的源代码文件中,典型地是在所有的#include指示符的后面:using namespace std;
1.2 六大组件
1)
迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象。
2) 容器是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器。
3) 算法是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
以下是六大组件列表说明:
组件英文名
|
组件中文名
|
含义
|
备注
|
iterators
|
迭代器
|
泛型指针
|
|
containers
|
容器
|
就是数据结构,用来存放元素
|
|
algorithms
|
算法
|
就是算法
|
|
function object
|
函数对象
|
一种行为类似函数的东西
|
|
allocators
|
配置器
|
用来分配内存空间
|
这一特性很多编译器不是很支持,建议使用默认值
|
adapters
|
适配器
|
用来修饰其它组件
|
可参考设计模式中的
adapter
|
2 组件一:迭代器描述
2.1 迭代器的类型
对于STL数据结构和算法,你可以使用五种迭代器。下面简要说明了这五种类型:
·
Input iterators
提供对数据的只读访问。
·
Output iterators
提供对数据的只写访问
·
Forward iterators
提供读写操作,并能向前推进迭代器。
·
Bidirectional iterators
提供读写操作,并能向前和向后操作。
·
Random access iterators
提供读写操作,并能在数据中随机移动。
尽管各种不同的STL实现细节方面有所不同,还是可以将上面的迭代器想象为一种类继承关系。从这个意义上说,下面的迭代器继承自上面的迭代器。由于这种继承关系,你可以将一个Forward迭代器作为一个output或input迭代器使用。
下面是各种iterator类型之间的关系列图:
input iterators
output iterators
/ /
forward iterators
|
bidirectional iterators
|
random access iterators
指针迭代器
正如下面的小程序显示的,一个指针也是一种迭代器。该程序同样显示了STL的一个主要特性——它不只是能够用于它自己的类类型,而且也能用于任何C或C++类型。
容器迭代器
尽管C++指针也是迭代器,但用的更多的是容器迭代器。容器迭代器用法和iterdemo.cpp一样,但和将迭代器申明为指针变量不同的是,你可以使用容器类方法来获取迭代器对象。两个典型的容器类方法是begin()和end()。它们在大多数容器中表示整个容器范围。其他一些容器还使用rbegin()和rend()方法提供反向迭代器,以按反向顺序指定对象范围。
常量迭代器
和指针一样,你可以给一个迭代器赋值。