C++用的比较少,最近准备试试CSP。于是就得赶紧学学STL。以前是用过,但是没咋记下来。
想查看所有std实体的话,使用下面的指令:
1
| apropos -r '^std' | vim -
|
关于apropos
,它是LINUX系统中的一个命令,用来通过关键字查找定位手册页的名字和描述。 它相当于使用带有-k选项的man命令。 每个手册页里都有一个简短的描述。 apropos在这个描述中查找keyword。这是使用man
帮助文档的一个好工具。
分类
1 2 3 4 5 6 7 8 9 10 11
| begin() end() rbegin() rend() front() back() erase() clear() push_back() pop_back() insert()
|
Vector
简而言之就是数组,但是优化过,缝合了诸如队列、栈一类的特性。
1 2 3 4 5 6 7 8
| vector<int> vec; vector<int> vec(5); vector<int> vec(10, 1); vector<int> vec(oldVec); vector<int> vec(oldVec.begin(), dolVec.begin()+3); int arr[5] = {1, 2, 3, 4, 5}; vector<int> vec(arr, arr+5); vector<int> vec(&arr[0], &arr[5]);
|
那么如果我希望直接在下标为5的位置直接放入这个3呢,那不是需要先往里塞入5个0才可以么?这种情况,我们就可以定义一下vector的长度,然后就可以当做数组一样用了
1 2
| vector<int> a(10); a[5] = 3;
|
List
双向链表。因此并不支持随机访问。尾部插入元素效率很高。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| list<int> l; list<int> l(5); list<int> l(10, 1); list<int> l(oldL); list<int> l(oldL.begin(), oldL.end()); int arr[5] = {1, 2, 3, 4, 5}; list<int> l(arr, arr+5); list<int> l(&arr[1], &arr[5]);
list.merge() list.remove() list.remove_if() list.reverse() list.sort() list.unique() list.splice()
push_front() pop_front()
|
Deque
双端队列。每个元素在内存上是连续的,类似vector,是它的升级版。它有高效的首尾插入/删除操作。实现方法相当于list和vector的折衷。
它支持随机访问和at()
。
1 2 3 4
| push_back() pop_back() push_front() pop_front()
|
- 关联式容器:
map, unordered_map, multimap, unordered_multimap, set, unordered_set, multiset, unordered_multiset
Map
一种基于红黑树的键值对数据结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| map.insert({key, value}); map[key] = value;
map.erase(key)
map.find() map[key]
map.count() map.contains() map.equal_range() map.lower_bound() map.upper_bound()
|
Unordered-Map
1
| #include <unordered_map>
|
区别于前者使用红黑树实现,它使用哈希函数实现,因此元素无序。
注意,默认情况下,它只支持使用int
作为键,其他类型是不合法的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| map.insert({key, value}); map[key] = value;
map.erase(key)
map.find() map[key]
map.count() map.contains() map.equal_range() map.lower_bound() map.upper_bound()
|
Set
set 是一个关键字集合, 其中的关键字 不可重复, 其底层采用红黑树实现, 因此集合中的元素是 有序 的, 在 set 容器上进行的搜索, 插入和移除等操作都是对数复杂度的.
特有操作:
1 2 3
| lower_bound() upper_bound() erase_if()
|
Stack
1 2 3 4 5 6
| #include <stack> stack<int> s; s.push(data); s.pop(); s.top(); s.empty()
|
Reference