在已有 C++ 尤其是 C++ 模板的基础上,从本节开始,我们开始系统地学习 STL 标准模板库,首先来了解什么是 STL,以及学习 STL 有什么用?
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
Vector数组
对比起数组固定性,Vector绝对是写数组的更方便的选择,Vector数组的创建删除插入等操作对比起数组绝对是更加方便的存在。
Vector数组的创建
Vector数组要包含头文件,并引入std命名空间
1
2
using namespace std;创建Vector数组
1
2
3
4
5
6
7
8
9
10
11vector<类型>标识符;
vector<类型>标识符(最大容量);
vector<类型>标识符(最大容量,初始所有值);
vector<vector<int> > v;//二维vector,这里最外的<>要有空格,否则较旧的编译器下无法通过(会识别成位运算)
//用向量b给向量a赋值,a的值完全等价于b的值
vector<int>a(b);
//将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
vector<int>a(b.begin(),b.begin+3);
//从数组中获得初值
int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);
Vector数组的初始化
1 | a.assign(); |
Vector数组的使用
1 | //返回a的最后一个元素 |
几个常用的函数
1 |
|
Set容器
set也是STL中比较常见的容器。set集合容器实现了红黑树的平衡二叉检索树的数据结构,它会自动调整二叉树的排列,把元素放到适当的位置。set容器所包含的元素的值是唯一的,集合中的元素按一定的顺序排列。
我们构造set集合的目的是为了快速的检索,不可直接去修改键值。
set容器的创建
照例先引入头文件
1
2
using namespace std;创建set容器的方法和创建vector函数的方法大同小异
1
set<类型>标识符;
set容器的操作
1 | insert() //在集合中插入元素 |
其实set的大部分操作是与vector类似的,不过set不支持随机访问,必须要使用迭代器去访问。由于set放入一个元素就会调整这个元素的位置,把它放到合适的位置,所以set中只有一个insert插入操作。
Pair容器
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
pair容器的创建
1 | pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。 |
pair容器的操作
1 | pair<int ,double> p1; |
Map容器
map是STL的一个关联容器,它提供一对一的hash。
第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。比如一个班级中,每个学生的学号跟他的姓名就存在著一对一映射的关系。
map容器的创建
1 |
|
map容器的操作
1 | begin() //返回指向map头部的迭代器 |
map应用实例
洛谷P1360 [USACO07MAR]Gold Balanced Lineup G
题解如下:
1 |
|