文章目录
C++的标准模板库(Standard Template Library, 简称STL)是一个容器和算法的类库,比较常用的容器有stack、queue、priorty_queue、set、vector、pair、string等,比较常用的算法有sort、max、min、abs、swap、reverse等
所有容器都支持的方法
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
size | 返回容器中的元素数目 | s.size() | O(1) |
empty | 判断容器是否为空,容器空时,返回true | s.empty() | O(1) |
栈(stack)
包含在stack头文件中
特点:只能在栈顶放入元素,在栈顶删除元素,后进先出
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 入栈(栈顶) | s.push(x) | O(1) |
pop | 出栈(栈顶) | s.pop() | O(1) |
top | 返回栈顶元素 | s.top() | O(1) |
循环队列(queue)
包含在queue头文件中
特点:只能从队头删除元素,从队尾放入元素,先进先出
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 入队(队尾) | que.push(x) | O(1) |
pop | 出队(队头) | que.pop() | O(1) |
front | 返回队头元素 | que.front() | O(1) |
back | 返回队尾元素 | que.back() | O(1) |
优先队列(priority_queue)
包含在queue头文件中
priority_queue可以理解为一个大根二叉堆,堆顶元素为最大值
声明一个从大到小取出数值的优先队列
priority_queue<int> que;//大根堆
声明一个从小到大取出数值的优先队列
priority_queue<int, vector<int>, greater<int> > que;//小根堆
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 把元素x插入堆 | que.push(x) | O(logn) |
pop | 删除堆顶元素 | que.pop() | O(logn) |
top | 返回堆顶元素 | que.top() | O(1) |
有序集合(set)
包含在set头文件中
set由红黑树实现,set中的元素不能重复,有自动去重的功能
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
clear | 清空 | s.clear() | O(n) |
insert | 插入元素x | s.insert(x) | O(logn) |
find | 返回等于x的元素的迭代器。若不存在等于x的元素,则返回s.end() | s.find(x) | O(logn) |
erase | 删除迭代器it指向的元素 | s.erase(it) | O(logn) |
erase | 删除等于x的元素 | s.erase(x) | O(logn) |
count | 返回集合中等于x的元素个数 | s.count(x) | O(logn) |
向量(vector)
包含在vector头文件中
vector是一个动态数组,可以像数组一样用下标访问元素
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
clear | 清空 | v.clear() | O(n) |
push_back | 把元素x放入vector尾部 | v.push_back(x) | O(1) |
pop_back | 删除vector尾部的最后一个元素 | v.pop_back | O(1) |
字典(map)
包含在map头文件中
map是一个关联容器,提供一对一的键值对(key-value)映射
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
clear | 清空 | m.clear() | O(n) |
insert | 插入键值对 | m.insert(make_pair(key, value)) | O(logn) |
find | 查找key为x的二元组,并返回其迭代器 | m.find(x) | O(logn) |
[ ] 操作符 | 返回key映射到的value | m[key] | O(logn) |
[ ] 操作符 | 对m[key]来进行赋值操作 | m[key] = value | O(logn) |
对组(pair)
包含在utility头文件中,但一般来说,iostream也包含它
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
make_pair | 构造一个对组 | make_pair(1, 2) | |
first | 返回第一个元素 | p.first | O(1) |
second | 返回第二个元素 | p.second | O(1) |
字符串(string)
包含在string头文件中
string是一个类,不用考虑内存分配问题,并且提供了一系列的操作函数
操作 | string | char* |
---|---|---|
定义 | string s | char s[105] |
获取第i个字符 | s[i] | s[i] |
返回长度 | s.size() | strlen(s) |
读入一行 | getline(cin, s) | gets(s) |
赋值 | s = “hello” | strcpy(s, “hello”) |
拼接 | s += “world” | strcat(s, “world”) |
比较 | s == “hello” | strcmp(s, “hello”) |
sort函数
包含在algorithm头文件中
用法:
注意:
-
sort排序的范围是前闭后开,例如:sort(arr, arr+10); 排序的范围是从arr[0]到arr[9]
-
sort的排序方法不写的话,默认是从小到大
从大到小的排序方法
bool cmp(int a, int b)
{
return a > b;
}
max、min函数
max(x, y):返回x和y中的最大值
min(x, y):返回x和y中的最小值
abs函数
abs(x):返回x的绝对值,x为整数。
如果要返回浮点数的绝对值,要用math.h头文件下的fabs
swap函数
swap(x, y):交换x和y的值
reverse函数
reverse(a, b):可以将数组指针在[a, b)之间的元素或容器的迭代器在[a, b)范围内的元素进行反转。
翻转数组
reverse(arr, arr + n);
翻转string
reverse(s.begin(), s.end());