一、STL简介
1、什么是STL:
标准模板库(Standard Template Library , STL)是一个C++通用库,其目的在于将组建标准化,节省开发者的时间和精力。从组织上来看,STL可分为六大部分,分别是迭代器(iterators)、算法(algorithms)、容器(container)、函数对象(function object)、内存分配器(allocator)和配接器(adapter)。其中的代码采用了模板类和模板函数实现,极大地提高了编程效率。STL相对于传统的编程方法,可以更好地实现代码的重用。
STL除了具有节省开发成本的有点之外,还具有以下特点:通用性好;运行效率高;数据结构简单却严谨、层次化好;安全机制完善、有较好的内存管理方法。
2、关于命名空间namespace:
命名空间技术是STL的特性之一,主要用于解决软件的模块组件化而可能产生的命名冲突。这种冲突主要来自不同看模块和库针对不同的对象所采用的相同的标识符表示。命名空间是开放的,因此利用一个namespace定义的一些组件可以散布于多个代码模块内。如C++标准库采用的就是一个命名空间,即“标准命名空间”std。如果在代码中使用了using namespace std;则会默认调用这个std命名空间内的标识符;如果要指定调用某个命名空间的标识符,则需要使用namespace::obj的方法,如:
std::cout<<"Hello World!"<<endl;
需要注意的是,最好不要在头文件、模块等位置使用using namespace声明,因为这可能会改变namespace的作用范围,导致其他模块收到未知的影响。
二、STL的基本结构
1、容器
容器类是STL的基本类之一,是可以包容其他类的结构。常见的有向量类(vector)、链表类(deque)、双向队列(list)、集合(set)、图(map)等。
1)vector<T>:一种容量可变的向量,可以实现顺序表结构的功能;
2)list<T>:双向链表容器,实现链表的功能;
3)queue<T>:队列容器,实现队列结构的功能;
4)stack<T>:栈容器,实现栈数据结构的功能;
5)deque<T>双端队列;
6)priority_queue<T>按值排序的队列;
7)set<T>集合容器
8)multiset<T>多重集合容器,允许出现重复元素;
9)map<key,val>键值对容器,可以实现根据key对val的查询;
10)multimap<key,val>多重键值对,允许出现重复的key值;
根据这些容器的不同特点,可以分为两大类:(1)顺序式容器:vector、list、deque等;(2)关联式容器:set、map等。
2、算法
STL提供了多种针对不同数据结构的算法,定于与std命名空间中,引用如下头文件后可以获取:
#include <algorithm>
一般来说,STL提供的算法函数具有多种优点:定义、操作简单;能根据输入数据的类型自动选择最合适的算法;
具体针对不同对象的算法函数可以参考相关书籍和文档。
3、迭代器
迭代器为访问容器提供了通用的方法,可以允许程序对容器进行反复访问,其作用类似于指向对象的指针。STL定义了5种不同的迭代器,以使用方式分别命名为输入、输出、前向、双向和随机访问5种,可用于不同种类的容器。不同的迭代器的特点和支持的容器类型如下所示:
1)输入迭代器:前向读取,支持istream等;
2)输出迭代器:前向写入,支持ostream、inserter等;
3)前向迭代器:前向读写;
4)双向迭代器:前向+反向读写,支持list、set(包括multiset)、map(包括multimap)等;
5)随机访问迭代器:随机读写,支持vector、deque、string等。
4、函数对象、内存分配器和配接器
所谓函数对象,可以理解为函数的一般形式;配接器主要用于接口间的转换,比如把数据从一个类中移到另一个类;内存分配器应用较少,接触到的时候再详述。