本篇博文主要参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html
STL(Standard Template Library),是C++的一个高效的标准模板库,主要包括了:
①容器;②迭代器;③算法;④仿函数;⑤迭代适配器;⑥空间适配器(allocator)主要包括对象的创建和销毁以及内存的获取和释放两个部分。
- -
1、STL容器:
1)标准STL序列容器:每个元素都有固定位置
vector:动态数组中加以管理,随机存取元素(用索引直接存取),数组尾部添加或者移除元素速度很快,在中间或者头部安插元素比较费时间,因为需要移动元素;
deque:随机存取元素,数组的头部和尾部添加或者移除元素速度都很快,只是在中部安插元素时候速度很慢;
list:双向链表,不提供随机存取,因为采用链表结构实现,因此在任何位置上面插入或者删除元素都很快,内部只需要简单调整一下指针而已。
string:通过数组实现,即类似vector,对于添加查找删除元素而言非常快,线性时间即可;
2)标准STL关联容器:元素的位置取决于特定的排序规则,与怎样插入元素并没有什么关系
set/multiset:内部的元素依据其值自动排序,Set内的相同熟知的元素只能出现一次,multiset内可包含多个数值相同的元素,内部由二叉树实现(实际由红黑树实现),便于查找;
map/multimap:Map的元素是成对的键值对,内部的元素依据值自动排序,Map内的相同数值的元素只能出现一次,multimap中也可以包含多个数值相同的元素,内部由二叉树实现(实际由红黑树实现),便于查找。
- -
2、STL迭代器
迭代器用于提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示,能够让迭代器预算法互不相干的发张,最后可以无间隙的粘合起来,容器提供迭代器,算法使用迭代器。
常见的迭代器包括:iterator、const_iterator、reverse_iterator和const_reverse_iterator,也可以划分为前向迭代器(派生出了输入迭代器和输出迭代器)—>双向迭代器—>随机访问迭代器,具体如下所示:
1)Input迭代器每次只能向前移动,一次一步,客户只能读取它们所指的东西,而不能进行修改,而且只能读取一次,istream_iterator是这种迭代器的代表,只适合“一次性操作算法”;
2)Output迭代器类似,一切只为输出,只能向前移动,一次一步,客户只能修改它们所指的东西,而且只能涂改一次,ostream_iterator是这种迭代器的代表,只适合“一次性操作算法”;
3)forward迭代器,这种迭代器可以做上述两种迭代器所能做的每一个,同时可以读或者写其所指物一次以上;
4)Bidirectional迭代器比上一个分类威力更大:它除了可以前向移动,还能后向移动,即双向移动;
5)random access迭代器威力更大,不仅可以进行双向移动移动,同时还可以进行移动随机步,即它可以在常量时间内向前或者向后跳转任意距离。
上述五种类型的关系可以表述为:
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_access_iterator_tag:public bidirectional_iterator_tag{};
上述structs之间的继承关系是有效的“is-a”关系,以此类推,我们很快就能看到这个继承关系的效力。
- -
3、STL算法
主要由头文件<algorithm>,<numeric>,<functional>组成。主要包括如下几种方法:
1)非可变序列算法:不直接修改其所操作的容器内容的算法;
2)可变序列算法:可以修改容器内容的一些算法;
3)排序算法:包括对序列进行排列组合、搜索以及有序序列上的集合操作;
4)数值算法:对容器内容进行数值计算。
- -
4、适配器
STL提供了三个容器适配器:queue、priority_queue和stack,这些适配器分别包装了vector、list和deque等顺序容器,
但是它们并没与迭代器,同时也无法插入或删除多个元素。
1)stack
#include <stack>
template <typename T,typename Container=deque>
class stack;
bool stack<T>::empty();
void stack<T>::pop();
stack<T>::push(T x);
stack<T>::size_type stack<T>::size();
T stack<T>::top();
2)queue
#include <queue>
template <typename T,typename Container=deque<T> >
class queue;
queue<T>::push(T x);
void queue<T>::pop();
T queue<T>::back();
T queue<T>::front();
queue<T>::size_type queue<T>::size();
bool queue<T>::empty()
3)priority_queue
#include <queue>
template <typename T,typename Container=vector<T>,typename Compare=less<T> >
class priority_queue;
priority_queue<T>::push(T x);
void priority_queue<T>::pop();
T priority_queue<T>::top();
priority_queue<T>::size_type priority_queue<T>::size();
bool priority_queue<T>::empty();