STL关联容器MAP、SET与multimap、multiset与hashmap、hashset的区别

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


你可能感兴趣的:(C++)