1.什么是STL
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;
2.SLT中六大组件
容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
仿函数(Functor)
适配器(Adaptor)
分配器(allocator)
3.STL常用容器
1.vector:
vector数组存储在头文件#include<vector>中,在算法竞赛中,为避免出错,一般用静态数组,能开多大就开多大。如果空间紧张,用STL的vector建立动态数组,不易出错。vector:动态数组,运行时根据需要改变数组大小。 以数组形式存储,内存空间是连续的,索引可以在常数时间内完成。但是在中间进行插入和删除操作,会造成内存块的拷贝。需要注意的是系统为某一程序分配空间时,所需的时间与空间大小无关,与申请次数有关。
vector开数组时采用倍增的思想,开始时是开一个一般大小的数组,每次长度不够,长度乘2;
功能如图:
补充:front()返回vector第一个数;back()返回最后一个数;begin()vector 第一个数;end() vector 最后一个数后面的数。
vector 支持比较运算(按字典序来比较)例如:
vector<int> a(4,3),b(3,4);
if(a<b) puts("a<b);
最后结果为a<b;
2.pair<int ,int>
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
pair<int,int> p; p.first为第一个元素 p.second 第二个元素
支持比较运算,以first为第一关键,second为第二关键(字典序);另外pair是可以存储任一多元素,不仅仅只说两个。
初始化:p=make_pair(10,"lz");
3.string
string支持:size()/lenght() 返回字符串长度;empty();clear();
另外string最关键的功能为a.substr(起始位置,子串长度) 分三种情况,1.输出从第一个数到第二个数的字符串,2.如果第二个数过大,那么输出第一个数到最后(这里第一个数为起始位置,第二个数为字串长度)3.省略第二个数,那么输出第一个数到最后。
如果想用printf输出字符串a那么:printf("%s\n",a.c_str());这里c_str()返回string a存储字符串的字符数组起适地址。
4.queue 队列
队列:基本的数据结构之一,特点是“先进先出”。例如排队,先进队列的,先得到服务。
queue没有clear()功能,想要清空可以直接q=queue<int> ();
5.priority_queue 优先队列(堆)
优先队列:优先级最高的先出队。
队列和排序的完美结合,不仅可以存储数据,还可以将这些数据按照设定的规则进行排序。
每次的push和pop操作,优先队列都会动态调整,把优先级最高的元素放在前面。
优先队列有关操作:push()插入一个数;top()返回堆顶元素;pop()弹出堆顶元素
这里需要注意优先队列默认为大根堆,如何变成小根堆:
(1) heap. push(-x)
插入一个元素时,插入它的负数
(2) 直接定义成小根锥
priority-queue <int, vector <int>.greater<int> heap;
6.stack 栈
栈:基本的数据结构之一,特点是“先进后出”。
例如:
坐电梯时,先进电梯的,最后出来;
一盒泡腾片,最先放进盒子的药片位于最底层,最后被拿出来。