pair C++11
定义数对 1 2 3 pair<int ,int > a (3 ,5 ) a = make_pair (4 ,6 )
修改数对 1 2 a.first = 1 a.second = 2
比较大小逻辑 1 a < b ? a.first < b.first || (a.first == b.first && a.second < b.second)
array C++11
定义数组 1 2 3 array<int ,5> a; int a[5 ];
stack 栈
定义
基本用法 1 2 3 4 5 6 7 8 9 10 stack<int > s; s.push (1 ); s.push (3 ); printf ("%d\n" ,s.top ());printf ("%d\n" ,(int )s.size ());s.pop (); printf ("%d\n" ,s.top ());printf ("%d\n" ,(int )s.size ());s.empty ();
queue 队列(先进先出)
定义
用法 1 2 3 4 5 6 7 8 9 10 11 queue<int > q; q.push (1 ); q.push (2 ); q.push (3 ); printf ("%d %d\n" ,q.front (),q.back ())q.pop (); printf ("%d %d\n" ,q.front (),q.back ())
bfs写法 1 2 3 4 5 6 7 8 9 queue<int > q; q.push (s); while (!q.empty ()){ int x = q.front (); q.pop (); for (int y : adj[x]){ q.push (y); } }
同样也q.empty()和q.size的写法
priority_queue 优先队列(大根堆)
时间复杂度:O(logn)
用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 priority_queue<int > v; v.push (3 ); v.push (1 ); v.push (2 ); while (!v.empty ()){ int x = v.top (); printf ("%d\n" ,x); v.pop (); } priority_queue<int > v; v.push (-3 ); v.push (-1 ); v.push (-2 ); while (!v.empty ()){ int x = v.top (); printf ("%d\n" ,-x); v.pop (); }
小根堆做法:对push进去的元素取反
或者
1 priority_queue<int , vector<int >,greater<int >> v;
deque 双端队列
定义
用法 1 2 3 4 5 6 7 8 deque<int > v v.push_front (1 ); v.push_back (2 ); v.pop_front (); v.pop_back ();
其中
1 push_front (),pop_front (),push_back (),pop_back ()
时间复杂度均为O(1)
vector 容器
(可以不设置大小)
定义 1 2 3 4 vector<int > v vector<int > v (3 ,100 ) ; vector<int > v (3 ) ; vector<int > v{3 ,100 }
改变容器大小
其中 v.size() 是无符号型,当 v.size() 为空的时候 写循环 v.size() - 1 会死循环,建议写成 (int)v.size() - 1
末尾存入数与删除数 时间复杂度均为O(1)
1 2 3 vector<int > v; v.push_back (1 ); v.pop_back ();
迭代器
1 2 3 4 5 6 7 8 9 10 vector<int >::iterator it = v.begin () printf ("%d\n" ,*it);for (auto it = v.begin ();it != v.end ();it++){ *it = *it + 1 ; printf ("%d\n" ,*it); }
插入/删除元素 1 2 3 v.insert (v.begin () + 1 , 2 ) v.erase (v.begin () + 2 );
遍历 1 2 3 4 5 6 7 8 9 10 11 12 13 for (int x : v){ x += 1 ; } for (int &x : v){ x += 1 ; }
排序 1 sort (v.begin (),v.end ());
二分查找 1 2 auto it = lower_bound (v.begin (),v.end (),2 )auto it = upper_bound (v.begin (),v.end (),2 );
存图 1 2 3 4 5 6 7 vector<int > g; for (int i = 1 ;i<=m;i++){ int u,v; scanf ("%d%d" , &u, &v); g[u].push_back (v); g[v].push_back (u); }
set 集合
有序且从小到大
插入与删除 1 2 3 4 5 6 vector<int > v; s.insert (x); s.erase (x); s.erase (s.begin ()); set<int > s (v.begin(),v.end()) ;
遍历 1 2 3 for (auto it = s.begin (); it != s.end (); it++) { printf ("%d\n" ,*it) }
查询是否存在
二分查找 1 2 3 4 s.lower_bound (x); s.upper_bound (x); auto it = s.lower_bound (x);auto it2 = prev (it);
map 哈希表
定义 1 2 map<int ,int > v; v[x] = y;
其他用法基本和set一样
multiset 可重复的哈希表,与map用法大部分一样
定义与用法 1 2 3 4 5 multiset<int > s; s.erase (x); s.erase (s.find (x)); s.count (x);
unordered_set与unordered_map 不支持lower_bound查询
内部实现是hash表的set和map
会被卡,常数不是很好,慎用。(期望复杂度:O(1))
string 定义 1 2 3 4 5 string s; int a = stoi (s);int a = stoll (s);string s = to_string (a); s += t;
用法 1 2 3 4 5 s.replace (start,length,str2); s.c_str (); s.find (t,pos); s.substr (start,length);
algorithm 算法库
翻转
旋转
随机打乱(C++11及之前都有) 1 random_shuffle (a,a + 5 );
排序 1 sort (a.begin (),a.end ());
最大最小值 1 2 auto it = min_element (a, a + 5 );auto it2 = max_element (a, a + 5 );
归并 1 2 3 merge (a.begin (),a.end (),b.begin (),b.end (),c.begin ());inplace_merge (a.begin (),a.begin () + k,a.end ());
找到第k小 1 nth_element (a.begin (),a.begin () + k,a.end ());
生成全排列 1 2 3 4 5 6 7 8 9 next_permutation (a,a + n);while (true ){ for (int i = 0 ; i < n; i++){ printf ("%d " ,a[i]); } puts ("" ); if (!next_permutation (a, a + n)) break ; }