【STL】算法竞赛常用STL
一些常用STL
Algorithm
sort
1 | sort(a, a + n, &cmp); |
lower_bound/upper_bound
条件:有序序列
默认:lower_bound找序列中第一个大于等于val的数,upper_bound找序列中第一个大于val的数。
1 | lower_bound(a, a + n, val); //返回第一个大于等于val的指针 |
equal_range
条件:有序序列
1 | equal_range(begin, end, val); |
注意返回的是迭代器,如果是数组即pair<int*,int*>
,如果是vector即pair<vector<int>::iterator,vector<int>::iterator>
unique
条件:有序序列
1 | unique(begin, end); |
常与erase操作一起用达到改变删去重复元素并改变数组长度的作用
1 | a.erase(unique(a.begin(), a.end()), a.end()); |
注意用在数组时是左闭右开。
next/prev_permutation
获取排列
next_permutation先小后大,prev_permutation先大后小
返回bool值,若有下一排列就返回true,否则返回false,且返回false的同时将数组改变为下一排列(从头开始的第一个排列)
1 | next_permutation(a, a+n, &cmp); //数组 |
- 在10之后很慢
reverse
翻转数组或迭代器
1 | reverse(a, a+n); |
array
.begin(), .end(), .size(), .max_size(), .empty(), .at(), .front(), .data()都与vector相同
.fill(n)把数组里的数都赋值为n
声明:array<int, n> a={xx,xx,…},n个元素,n只能为常数
访问:auto it=a.begin(),it++
array与数组储存在栈中,vector储存在堆中
utility
pair
1 | pair<T1, T2> p; |
swap
C++11前在algorithm头文件,之后在utility头文件
set/multiset
set无重复元素,multiset元素可重复
声明:
1 | set<T, &cmp> st; |
使用:
1 | set<T>::iterator it; //声明迭代器 |
vector
声明:
1 | vector<T> a; |
使用:
1 | vector<T>::iterator it; //声明迭代器 |
map/multimap
映射,一一映射和多重映射,键值有序,查询O(n)
声明:
1 | std::map<T1, T2> mp; //单重映射,允许下标访问 |
使用:
1 | mp.at(key); mp[key]; //用键值访问 |
unordered_map/unordered_set
无序map和set,查询O(1),与map、set基本相同,但不支持迭代器遍历
1 | std::unordered_set<T> st; |
stack
栈,先进后出
声明:
1 | stack<T> st; |
使用:
1 | st.empty(); //如果栈空返回1,不空返回0 |
- 不可用迭代器遍历
- 没有clear
queue
队列,先进先出/双端队列,前后都可入队、出队
声明:
1 | queue<T> q; |
使用:
1 | q.empty(); //如果队列空返回1,不空返回0 |
- 不可用迭代器遍历
- 没有clear
deque
1 | q.begin(); q.end(); //获得首、尾迭代器 |
priority_queue
优先队列,堆结构
声明:
1 | priority_queue<T, vector<T> > q; //降序,大根堆 |
使用:
1 | q.empty(); //如果队列空返回1,不空返回0 |
list
链表
声明:
1 | list<T> ls; |
使用:包括迭代器、insert等
bitset
二进制,以数组形式保存
声明:
1 | bitset<n> a(string("1010001")); //n为长度,可以直接用a[i]访问 |
使用:
1 | a.count(); //返回有多少个1 |