📅  最后修改于: 2023-12-03 15:20:07.069000             🧑  作者: Mango
std::set
是一个集合容器,容器中元素唯一且按照升序排序。set 的底层使用的是红黑树的数据结构,具有对数时间复杂度的插入、删除和查找操作。在插入元素时,元素将按照其键值自动排序。
set 函数声明如下:
template<class T, class Compare = less<T>, class Allocator = allocator<T>>
class set;
std::multiset
和 std::set
一样是一个集合容器,区别在于 multiset 允许容器中存在相同元素。 multiset 的底层同样使用的是红黑树,也具有对数时间复杂度的插入、删除和查找操作。在插入元素时,元素将按照其键值自动排序。
multiset 函数声明如下:
template<class T, class Compare = less<T>, class Allocator = allocator<T>>
class multiset;
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;
std::unordered_multiset
和 std::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 存储元素无序,但允许存储相同元素。因此,在进行集合类型的存储时,根据实际场景选择适当的容器可以有效提高程序效率。