STL 使用手册 1 2 3 4 .size () .empty () .clear ()
一、vector 本质仍是数组,只是内存可以可以自动变化。
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 vector<int >a; vector<int >a[N]; vector<int >::iterator it; a.push_back (x) a.pop_back () a.erase () a.front () a.back () a.begin () a.end () sort (a.begin (),a.end ()); a.erase ( (unique (a.begin),a.end ()) ,a.end ()); sort (a.begin (), a.end (), greater <int >()) for (int i=0 ; i<a.size (); i++)for (vector<int >::iterator i=a.begin (); i!=a.end (); i++) for (auto x:a)
二、pair 和 string pari,相当于结构体,按字典序,第一关键字为first,第二关键字为second。
1 2 3 4 5 pair<int ,string> p; p.first (); p.second ();
string,字符串,内容为字符的数组。用法大抵相同。
1 2 3 4 5 6 7 string s; cin>>s; s.substr (a,b); transform (s.begin (),s.end (),s.begin (),::tolower); transform (s.begin (),s.end (),s.begin (),::toupper);
三、stack 先进后出,类似汉诺塔。
1 2 3 4 5 6 stack<int >s; s.push (x); s.pop (); s.top ();
四、queue 和 priority_queue 队列queue相当于,栈的栈底开口出去,栈顶只能进去。优先队列priority_queue是可以自动排序的queue。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 queue<int >q; q.push (x); q.pop (); q.front (); q.back (); priority_queue<int > a; priority_queue<int , vector<int >, greater<int >> a; a.push (x); a.pop (); a.top ();
五、deque 队头队尾均可插入弹出。
1 2 3 4 5 6 7 8 9 10 11 deque<int > a; a.push_back (x); a.push_front (x); a.pop_back (); a.pop_front (); a.begin (); a.end (); a.front (); a.back ();
六、set、multiset、unordered_set、unordered_multiset “有序集合”和“有序多重集合”,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一棵红黑树,它们支持的函数基本相同。
无序集合unordered_set与普通集合所有操作都一样,所有操作的时间复杂度变为了O(1),但没有lower_bound和upper_bound操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 set<int > s; multiset<int > s; s.insert (x); s.erase (it); s.begin (); s.end (); s.find (x) s.lower_bound (x); s.upper_bound (x); s.count (x); unordered_set<int > a; unordered_multiset<int > a;
七、map、unordered_map map容器是一个键值对key-value的映射,其内部实现是一棵以key为关键码的红黑树,map的key和value可以是任意类型,其中key必须定义小于号运算符。(也可以看成是哈希表。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 map<string, int > m; m["headm" ]=1 ; m.insert ({one,2 }); m.erase (x); a.begin (); a.end (); map.count (key) > 0 ; if (a.find (x) == a.end ()); unordered_map<int , int > a;
八、bitset bitset相当于⼀个数组,但是它是从⼆进制的低位到⾼位分别为b[0]、 b[1]……的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 bitset<1000> a; bitset<5> b; 都为0 bitset<5> b (u) ; u为unsigned int ,如果u = 1 ,则输出b的结果为00001 bitset<8 > b (s); s为字符串,如"1101" ,则输出b的结果为00001101 ,在前⾯补0 bitset<5> b (s, pos, n) ; 从字符串的s[pos]开始, n位⻓度a[0 ] = 1 ; b.any (); b.none (); b.count (); b.size (); b.test (2 ); b.set (4 ); b.reset (); b.reset (3 ); b.flip (); flip (); flip (k); unsigned long a = b.to_ulong ();
九、位运算 1 2 3 4 5 6 7 x >> k & 1 ; lowbit (x) = x & (-x); if (a&1 ) return odd; else return even;
十、常用库函数 reverse, unique,
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 31 32 33 34 35 36 37 38 39 40 41 #include <algorithm> reverse (a.begin (), a.end ()); reverse (a, a + n); unique (a, a + n);int m = unique (a.begin (), a.end ()) – a.begin (); int m = unique (a , a + n) – a;a.erase (unique (a.begin (), a.end ()), a.end ()); #include <ctime> srand (time (0 ));random_shuffle (a.begin (), a.end ()); sort (a.begin (), a.end ()); sort (a.begin (), a.end (), greater <int >()); bool cmp (int a, int b) { return a < b; } sort (a.begin (), a.end (), cmp); struct rec { int x, y; }; bool cmp (rec a, rec b) { return a.x > b.x; } rec a[5 ]; sort (a, a + 5 , cmp);lower_bound (a.begin (), a.end (), x) upper_bound (a.begin (), a.end (), x)
十一、常用技巧
由数据范围反推算法复杂度以及算法内容