vector
变长数组。倍增思想。
系统为某一程序分配空间时,所需时间与分配的空间大小无关,与申请次数有关。
初始时,为 vector 申请 32 个空间长度,当空间占满后,申请 2 倍大小的空间,然后将原来的 32 个空间中的内容复制到新的空间中,继续使用新的空间。
复制元素均摊后时间复杂度为 O(1)。
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <vector> #include <iostream> using namespace std;
int main () { vector<int> a; vector<int> b(10); vector<int> c(10, 3); vector<vector<int>> res(m, vector<int>(n));
a.size(); a.empty(); a.clear(); a.front(); a.back(); a.push_back(); a.pop_back(); a.begin(); a.end(); a[5];
for(int i=0;i<a.size();i++) cout << a << ' '; cout << endl;
for(vector<int>::iterator i = a.begin();i!=a.end();i++) cout << a << ' '; cout << endl;
for(auto x: a) cout << a << ' '; cout << endl;
vector<int> m(4, 3); vector<int> n(3, 4); if(m < n) puts("m < n");
return 0; }
|
pair
存储一个二元组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <vector> #include <iostream> using namespace std;
int main () { pair<int, string> p; pair<int, pair<int, string>> p2; p = make_pair(3, "abc"); p = {4, "def"}; p.first; p.second; return 0; }
|
string
字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <vector> #include <iostream> using namespace std;
int main () { string s; s.size(); s.empty(); s.clear(); s += 'a'; s += "abc";
s.subtr(i, j); printf("%s", s.c_str()); return 0; }
|
常用操作
substr
从下标 i 开始截取 j 个字符。
c_str
返回一个 char*,指向字符串起始位置。
queue
队列
常用操作
没有 clear 函数。
push
向队尾插入一个元素。
front
返回队头元素。
pop
弹出队头元素。
priority_queue
优先队列,是一个堆。默认是大根堆。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <vector> #include <queue> #include <iostream> using namespace std;
int main () { priority_queue<int> q; priority_queue<int, vector<int>, greater<int>> p; return 0; }
|
常用操作
没有 clear 函数。
push
向堆中插入一个元素。
top
返回堆顶元素。
pop
弹出堆顶元素。
stack
栈
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <stack> #include <iostream> using namespace std;
int main () { stack<int> stk; stk.push(3); stk.top(); stk.pop(); return 0; }
|
常用操作
没有 clear 函数。
push
向栈中插入一个元素。
top
返回栈顶元素。
pop
弹出栈顶元素。
deque
双端队列,队头队尾都可以插入删除,支持随机访问。加强版的 vector。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <deque> #include <iostream> using namespace std;
int main () { deque<int> a; a.front(); a.back(); a.push_back(); a.pop_back(); a.push_front(); a.pop_front(); a[5]; return 0; }
|
set, map, multiset, multimap
基于平衡二叉树(红黑树)实现,动态维护一个有序序列。
增删改查操作时间复杂度为 O(log(n))。支持跟排序有关的操作。
set/multiset
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #include <set> #include <iostream> using namespace std;
int main () { set<int> s; s.insert(5); s.insert(6); s.insert(7); s.insert(8); s.find(5); s.count(5); s.erase(5); s.lower_bound(6); s.upper_bound(6); return 0; }
|
常用操作
insert
插入一个数。
find
查找一个数,返回迭代器。
count
统计一个数出现的次数。
erase
erase(x)
可以输入一个数 x,会删除集合中所有的 x;也可以输入一个迭代器,删除这个迭代器指向的数。
lower_bound
lower_bound(x) 返回大于等于 x 的第一个数(也可以说是最小的数)的迭代器。
upper_bound
upper_bound(x) 返回大于 x 的第一个数(也可以说是最小的数)的迭代器。
begin
迭代器支持 --
和 ++
操作。返回当前节点在有序序列中的前驱和后继。时间复杂度为 O(log(n))。
end
迭代器支持 --
和 ++
操作。返回当前节点在有序序列中的前驱和后继。时间复杂度为 O(log(n))。
map/multimap
map 用于做映射。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <map> #include <iostream> using namespace std;
int main () { map<string, int> a; a["abc"] = 1; cout << a["abc"] << endl; for(auto [k, v]: a) cout << k << "->" << v << endl; return 0; }
|
常用操作
insert
输入的内容是一个 pair
。
erase
输入参数可以为 pair
或迭代器。
find
查找一个数,返回迭代器。
lower_bound
lower_bound(x) 返回大于等于 x 的第一个数(也可以说是最小的数)的迭代器。
upper_bound
upper_bound(x) 返回大于 x 的第一个数(也可以说是最小的数)的迭代器。
随机访问 []
可以像使用数组一样使用 map。时间复杂度为 O(log(n))。
unordered_set, unordered_map, unordered_multiset, unordered_multimap
基于哈希表实现。与上面类似,不支持 lower_bound/upper_bound
,不支持迭代器的 --
、++
。增删改查操作时间复杂度为 O(1)。
bitset
压位
比布尔数组省 8 倍的内存。用于压缩存储 bool 类型的数据。bool 数组每个元素占 1 个字节。
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
| #include <bitset> #include <iostream> using namespace std;
int main () { bitset<10000> s; bitset<10000> t; ~s; s | t; s & t; s ^ t; s >>= 3; t <<= 2; s == t; s != t; s.count(); s.any(); s.none(); s.set(); s.set(k, v); s.reset(); s.flip(); s.flip(k); return 0; }
|