一些常用STL
Algorithm
sort
1 2 sort (a, a + n, &cmp); stable_sort (a, a + n, &cmp);
lower_bound/upper_bound
条件:有序序列
默认:lower_bound找序列中第一个大于等于 val的数,upper_bound找序列中第一个大于 val的数。
1 2 3 4 lower_bound (a, a + n, val); upper_bound (a, a + n, val); lower_bound (a, a + n, val, greater <T>()); upper_bound (a, a + n, val, greater <T>());
equal_range
条件:有序序列
1 2 3 equal_range (begin, end, val);
注意返回的是迭代器,如果是数组即pair<int*,int*>,如果是vector即pair<vector<int>::iterator,vector<int>::iterator>
unique
条件:有序序列
常与erase操作一起用达到改变删去重复元素并改变数组长度的作用
1 a.erase (unique (a.begin (), a.end ()), a.end ());
注意用在数组时是左闭右开。
next/prev_permutation
获取排列
next_permutation先小后大,prev_permutation先大后小
返回bool值,若有下一排列就返回true,否则返回false,且返回false的同时将数组改变为下一排列(从头开始的第一个排列)
1 2 next_permutation (a, a+n, &cmp); next_permutation (begin, end, &cmp);
reverse
翻转数组或迭代器
1 2 reverse (a, a+n);reverse (begin, end);
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 2 3 4 pair<T1, T2> p; p.first p.second make_pair (a,b)
swap
C++11前在algorithm头文件,之后在utility头文件
set/multiset
set无重复元素,multiset元素可重复
声明:
1 2 3 4 5 set<T, &cmp> st; multiset<T, &cmp> st; set<T> st (st1) ; set<T> st (st2.begin(), st2.end()) ; set<T> st (arr, arr+n) ;
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 set<T>::iterator it; st.begin (); st.end (); st.rbegin (); st.rend (); st.empty (); st.size (); st.max_size (); st.insert (x); st.insert (arr, arr+n); st.insert (begin, end); st.erase (x); st.erase (it); st.erase (begin, end); st.find (x); st.count (x); st.clear (); st.swap (st1);
vector
声明:
1 2 3 4 5 6 7 8 9 vector<T> a; vector<T> a = (n, i); vector<vector<T> > a (N); for (int i = 0 ; i < N; i++) a[i].resize (M); vector<vector<T> > a (N, vector <T>(M));
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 vector<T>::iterator it; a.begin (); a.end (); a.rbegin (); a.rend (); a.empty (); a.size (); a.max_size (); a.capacity (); a.resize (x); a.push_back (); a.pop_back (); a.insert (it, n, i); a.erase (it); a.erase (it, it+n); a.assign (n, i); a.assign (arr, arr+n); a.at (i) = j; a[i] = j; a.front (); a.back (); a.clear (); a.swap (a1); a.reverse (begin, end);
map/multimap
映射,一一映射和多重映射,键值有序,查询O(n)
声明:
1 2 std::map<T1, T2> mp; std::multimap<T1, T2> mp;
使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 mp.at (key); mp[key]; it->first; it->second; a.size (); a.max_size (); mp.begin (); mp.end (); st.insert (x); st.insert (arr, arr+n); st.insert (begin, end); st.erase (x); st.erase (it); st.erase (begin, end);
unordered_map/unordered_set
无序map和set,查询O(1),与map、set基本相同,但不支持迭代器遍历
1 2 std::unordered_set<T> st; std::unordersd_map<T1, T2> mp;
stack
栈,先进后出
声明:
使用:
1 2 3 4 5 6 st.empty (); st.pop (); st.push (); st.top (); st.size ();
queue
队列,先进先出/双端队列,前后都可入队、出队
声明:
1 2 3 4 queue<T> q; queue<T> q (n, i) ; deque<T> q0;
使用:
1 2 3 4 5 6 q.empty (); q.pop (); q.push (); q.front (); q.back () q.size ();
deque
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 q.begin (); q.end (); q.rbegin (); q.rend (); q.empty (); q.size (); q.max_size (); q.capacity (); q.resize (x); q.push_back (); q.pop_back (); q.push_front (); q.pop_front (); q.insert (it, n, i); q.erase (it); q.erase (it, it+n); q.assign (n, i); q.assign (arr, arr+n); q.at (i) = j; q[i] = j; q.front (); q.back (); q.clear (); q.swap (q1); q.reverse (begin, end);
priority_queue
优先队列,堆结构
声明:
1 2 3 4 5 6 7 priority_queue<T, vector<T> > q; priority_queue<T, vector<T>, greater<T> > q; priority_queue<T, vector<T>, cmp> q; struct cmp { bool operator () (name y, name z) { return y.x<z.x; } }
使用:
1 2 3 4 5 6 q.empty (); q.pop (); q.push (); q.front (); q.back () q.size ();
list
链表
声明:
使用:包括迭代器、insert等
bitset
二进制,以数组形式保存
声明:
1 bitset<n> a (string("1010001" )) ;
使用:
1 2 3 4 5 6 7 8 9 a.count (); a.test (i); a.set (); a.set (x); a.set (x,y); bitset<M> f[N]; f[n]|=f[k]; f[n]<<=k;