📌  相关文章
📜  set、multiset、unordered_set、unordered_multiset的区别(1)

📅  最后修改于: 2023-12-03 15:20:07.069000             🧑  作者: Mango

set、multiset、unordered_set、unordered_multiset的区别
1. set

std::set 是一个集合容器,容器中元素唯一且按照升序排序。set 的底层使用的是红黑树的数据结构,具有对数时间复杂度的插入、删除和查找操作。在插入元素时,元素将按照其键值自动排序。

set 函数声明如下:

template<class T, class Compare = less<T>, class Allocator = allocator<T>> 
class set;
2. multiset

std::multisetstd::set 一样是一个集合容器,区别在于 multiset 允许容器中存在相同元素。 multiset 的底层同样使用的是红黑树,也具有对数时间复杂度的插入、删除和查找操作。在插入元素时,元素将按照其键值自动排序。

multiset 函数声明如下:

template<class T, class Compare = less<T>, class Allocator = allocator<T>> 
class multiset;
3. unordered_set

std::unordered_set是一个哈希表容器,容器中元素唯一且无序。在 C++11 中引入,为实现元素唯一性,unordered_set 底层使用的是哈希表数据结构。哈希表操作时间复杂度为常数级别,因此,unordered_set 比 set 和 multiset 拥有更快的查找速度。

unordered_set 函数声明如下:

template<class Key, class Hash = hash<Key>, class KeyEqual = equal_to<Key>, 
class Allocator = allocator<Key>> 
class unordered_set;
4. unordered_multiset

std::unordered_multisetstd::unordered_set 一样是一个哈希表容器,区别在于 unordered_multiset 允许容器中存在相同元素。在插入元素时,元素会自动散列,散列后的结果会被映射到桶中。桶是一个链表,存储了对应散列值的具有相同散列结果的元素。元素的查找时间复杂度为常数级别。

unordered_multiset 函数声明如下:

template<class Key, class Hash = hash<Key>, class KeyEqual = equal_to<Key>, 
class Allocator = allocator<Key>> 
class unordered_multiset;
总结

set 和 unordered_set 都是集合类型的容器,分别使用红黑树和哈希表实现,最大的区别在于 set 存储的元素唯一且有序,而 unordered_set 存储的元素唯一且无序。multiset 和 unordered_multiset 也是集合类型的容器,区别在于 multiset 允许存储相同元素,而 unordered_multiset 存储元素无序,但允许存储相同元素。因此,在进行集合类型的存储时,根据实际场景选择适当的容器可以有效提高程序效率。