一入门: 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()方法提供反向迭代器,以按反向顺序指定对象范围。
常量迭代器
和指针一样,你可以给一个迭代器赋值。
本文转载自IT网it求职笔试真题库网。