定义
set | map | unordered_set(c++11) | unordered_map (c++11) | |
---|---|---|---|---|
原理 | RB树 | RB树 | Hash table | Hash table |
元素的值 | 唯一 | key唯一,value不唯一 | 同set | 同map |
下标操作 | 不支持 | 支持 | ||
自动排序 | 强制排序 | 按key强制排序 | ||
查找时间复杂度 | log(n) | 平均为O(1),最坏情况为O(n) | ||
插入时间复杂度 | log(n)+Rebalance | |||
删除时间复杂度 | log(n)+Rebalance | |||
总结 | set和unordered_set(map同理)就外部使用来说是完全一致的。对于那些有顺序要求的问题,用set会更高效一些。对于查找问题,unordered_set会高效一些。另外,unordered_set执行效率是比set高的。 | |||
注 | Rebalance:元素重新自动排序 |
附录
-
顺序容器包括vector、deque、list、forward_list、array、string。
所有顺序容器都提供了快速顺序访问元素的能力。元素通过容器中的位置进行顺序保存和访问。
关联容器包括set、map。
元素通过关键字进行保存和访问。 - map是key_value的形式,所以map里的所有元素都是pair类型。pair里面的first被称为key(键),second被称为value(值)。它可以通过关键字查找映射关联信息value,同时根据key值进行排序。
- 无论是set还是unordered_set(map同理),都可以用multi形式(multiset和unordered_multiset)实现关键字冗余(可重复出现)。
- set就是关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。
- map和set是稳定排序,multimap和multiset是不稳定排序。