概述
STL,即为标准模板库,是 Standard Tenplate Library 的简称。它里面包含容器、算法等。
因为是 C++ 标准库,所以以下提到的容器、函数等都处于 std
命名空间中。
有时候写题目时很有帮助。
容器
vector
In header <vector>
.
vector
是动态的连续数组。创建时尖括号中填写要存的数据类型。
成员函数:
构造(创建时可选)(vector()
):
构造的参数有两个,第一个填写容器大小(将 vector 变为定长的),第二个填写初始化数字(可选)。
例如:std::vector<int> a(3, 5)
创建一个数据类型为 int,长度为 10,内容为 {5, 5, 5} 的 vector。
- 访问
at(pos)
: 带越界检查的访问,若越界抛出std::out_of_range
类型的异常。operator[]
: 访问指定元素。front()
: 访问第一个元素。back()
: 访问最后一个元素。
- 迭代器(弄不懂)
begin()
: 返回指向起始的迭代器。end()
: 返回指向末尾的迭代器。
- 容量
empty()
: 返回是否为空。size()
: 返回容器大小。
- 修改
push_back(value)
: 向末尾追加value
。clear()
: 清除所有元素,此后调用size()
返回 0。
- 其他
operator=
: 将一个 vector 容器赋值给另一个容器。
例子:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a; // int 类型的容器
vector<short> b(10); // short 类型的容器,大小为 10
vector<int> c(100, 1); // int 类型,大小为 100,全部初始赋值为 1
a.push_back(114); // 追加 114
a.push_back(514);
printf("a:: size:%d {%d, %d}\n", a.size(), a[0], a.at(1)); // a:: size:2 {114, 514}
// 大小;访问
printf("b:: size:%d {", b.size()); // 大小已确定为 10
b[5] = 32767;
for(int i = 0; i < 10; i++)
{
printf("%d", b[i]);
if(i != 9) printf(", ");
else printf("}\n");
}
// b:: size:10 {0, 0, 0, 0, 0, 32767, 0, 0, 0, 0}
c.back() = 2; // 将最后一个元素赋值为 2
printf("c:: front:%d back:%d ", c.front(), c.back());
c.clear();
printf("afterClear-> size: %d", c.size());
// c:: front:1 back:2 afterClear-> size: 0
}
/*
a:: size:2 {114, 514}
b:: size:10 {0, 0, 0, 0, 0, 32767, 0, 0, 0, 0}
c:: front:1 back:2 afterClear-> size: 0
*/
stack/queue
In header <stack>
.
stack,STL 的栈,提供先进后出 (FILO, First In Last Out) 的结构。
In header <queue>
.
queue,STL 的队列,提供先进先出 (FIFO, First In First Out) 的结构。
之前讲过,不再赘述
priority_queue
In header <queue>
.
优先队列,默认为最大优先队列(大的元素在上)(std::less<typename>
)。填写模板形参时,第一个填写数据类型,第二个填写容器(默认和通常都写 vector<typename>
,第三个填写该如何比较(默认为 std::less<typename>
,通常另外填 std::greater<typename>
最小优先队列)。
它的成员函数与 stack 类似,不再赘述。
例子:
#include <queue>
#include <cstdio>
using namespace std;
priority_queue<int, vector<int>, greater<int>> a; // 小数在上,升序
priority_queue<int> b; // priority_queue<int, vector<int>, less<int>> b; // 大数在上,降序
int mp[6] = {10, 5, 20, 1, 35, 30};
int main()
{
for(int i = 0; i < 6; i++)
{
a.push(mp[i]);
b.push(mp[i]);
}
printf("a: ");
while(!a.empty())
{
printf("%2d ", a.top());
a.pop();
}
printf("\nb: ");
while(!b.empty())
{
printf("%2d ", b.top());
b.pop();
}
printf("\n");
return 0;
}
/*
a: 1 5 10 20 30 35
b: 35 30 20 10 5 1
*/
函数
In header <algorithm>
.
lower-bound / upper-bound
lower-bound(first, last, value)
:first
, last
为要查找的起始和终止范围;value
为要查找的值。
返回第一个大于等于 value
的值的地址(迭代器)。
upper_bound
参数同上,返回第一个大于 value
的值的地址(迭代器)。
sort
swap
两个参数,交换元素。