MAP:底层用红黑树RB_tree实现,在查找、删除、添加等操作都有很高的效率,而且是排好序的,且不允许重复。
hashmap:重点是map,底层基于hashtable实现,哈希表即是散列表,实质是一个数组。Hashmap就是中和了数组和链表的有点,找到了一个寻址容易同时插入删除也容易的方法,它采用的是数组+链表的实现方式。优点是查找、删除、添加的时间复杂度为O(1);缺点也很明显,就是不能有重复,不能排序,占用内存大,只能处理char,int,short等类型,不能处理string,double,float类型,想要处理的话必须自己加hash function,由于不是C++标准,移植性需要考虑在内。
set主要是集合功能,底层采用红黑树,默认排好序。hashset底层通过hashtable实现。
总结:加有hash几个字的一些结构,底层都是由hashtable来提供的,不加的都是由红黑树来提供set和multiset的区别就是后者允许键值重复,map和multimap也一样。实现时通过insert_equal()和insert_unique)来控制。
| 底层实现 | 优点 | 缺点 |
map | 红黑树 | 添加、删除、查找速度快,默认排好序,键值唯一,占用内存少 | 添加、删除、查找速度比hashmap慢 |
hashmap | 哈希表(实质是数组) | 添加、删除、查找速度比map更快,常数级,不排序,键值唯一 | 占用内存多 |
multimap | 红黑树 | 与map相同,多了键值不唯一 | 添加、删除、查找速度比hashmap慢 |
set | 红黑树 | 添加、删除、查找速度快,默认排好序,值唯一,占用内存少 | 添加、删除、查找速度比hashset慢 |
hashset | 哈希表(实质是数组) | 添加、删除、查找速度比map更快,常数级,不排序,值唯一 | 占用内存多 |
multiset | 红黑树 | 与set相同,多了值不唯一 | 添加、删除、查找速度比hashset慢 |