第10章: 关联容器
概述
序列容器(第9章)把元素存放在你放置的位置上:下标 0、下标 1,依此类推。关联容器不在乎位置。你给它一个键,之后它就能把元素再找出来,而你不必记住它放在了哪里。
本章的容器都使用字符串键。这正是真实程序里最要紧的情形:统计词频、把名字映射到记录、查找配置项、缓存结果、判断某个 token 是否存在。fast_io 为此提供两个家族,每个家族都有集合形式(键就是整个元素)和映射形式(键附带一个值):
| 家族 | 集合 | 映射 | 元素的顺序 |
|---|---|---|---|
| B 树 | ::fast_io::str_btree_set |
::fast_io::str_btree_map<M> |
始终按键有序。 |
| 有序统计 B 树 | ::fast_io::str_ranked_btree_set |
::fast_io::str_ranked_btree_map<M> |
按键有序,并且知道每个元素之前有多少个元素。 |
| Swiss 表(哈希) | ::fast_io::str_swiss_set |
::fast_io::str_swiss_map<M> |
无序 — 顺序是哈希的副产物。 |
这六种类型共享同一套接口风格,因此你为其中一个学到的用法大多能直接搬到其他几个上:insert_key、contains、find、erase_key,以及用 begin()/end() 遍历。差别在于每个家族在此之外还能做什么(顺序、排名、容量),以及每个元素要维护多少额外信息。
键自己拥有字符。当你插入
"alpha" 时,容器保留一份自己的、以空字符结尾的副本。而查找时你只传一个视图(::fast_io::string_view / ::fast_io::cstring_view),所以查找永不分配内存。详见第10.1章。