容器
约 489 个字 44 行代码 5 张图片 预计阅读时间 2 分钟
All STL containers are templates.
有序容器
存储连续的元素
vector
std::vector
(在vector
头文件中)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
并没办法从头插入元素(不支持push_front
)
deque
属于双端队列,在头文件deque
中,有和vector
相同的接口,但deque
独有push_front/pop_front
关联式容器
Associative containers organize elements by unique keys
map
std::map<K, V>
maps key to values.
1 2 3 4 5 |
|
map stores a collection of std::pair<const K, V>
遍历map
采取基于范围的遍历方式
1 2 3 4 5 6 |
|
也可通过structured bindings 『C++17』
1 2 3 4 |
|
map如何实现的? → BST(红黑树)
PS: 在使用std::map<K, V>
时,K必须实现operator<
,因为会根据K进行排序和查找
- e.g
int
类型默认就提供了operator<
- 另外定义个类,如果要进行比较类的对象,则必须进行实现,如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
set
set集合,包含在头文件set中,没有重复的元素,是map的特殊形式(即没有Values)
另外: unordered_map
和 unordered_set
unordered_map
优化的map版本,有和map一样的接口- map是
std::pair
的集合 - 而
unordered_map
stores a collection of n "buckets" of pairs.
- map是
为何用std::unordered_map
:
- 通过保持 "load factor" 小,使得快速查找
- load factor: average number items per bucket.
- 若太大(>1.0),rehash! (可进行设置load factor, 参考
max_load_factor
)
PS: unordered_set
即是unordered_map
没有value,仅仅考虑key
为何unordered_map/unordered_set
通常更快?
hashing + small load factor.
什么时候使用unordered_map
和map
unordered_map
通常更快,并且需要更多的内存- 如果key并没有要求顺序(
operator<
),则可以使用unordered_map
- (
unordered_map
通常是更好的选择)
另外的容器
std::array
:封装固定大小数组的容器std::list
:a doubly linked liststd::multiset(+unordered)
:A set that can contain duplicatesstd::multimap(+unordered)
: can contain multiple values for the same key.
迭代器(Iterators)
Q: 遍历时for(const auto& elem : container)
如何工作的?
- container可为
deque/vector/map/set
等
e.g. for (auto elem : s) std::cout << elem;
(此处s为集合set)。等价如下形式:
1 2 3 4 |
|
PS: ++it
avoids making an unnecessary copy. 参考