set
、multiset
和 unordered_set
是 C++ 标准库中的三种集合容器。它们都可以用于存储不重复的元素,但各自有不同的特性和用法。下面是它们的基本操作和区别:
1. set
set
是一种有序集合,内部实现通常是红黑树。它存储的元素自动按升序排列,且不允许重复元素。
常用操作:
- 插入元素:
insert(const T& value)
:将value
插入到集合中。
- 删除元素:
erase(iterator pos)
:删除指定位置的元素。erase(const T& value)
:删除指定值的元素。
- 查找元素:
find(const T& value)
:返回指向value
的迭代器,如果未找到则返回end()
。count(const T& value)
:返回集合中等于value
的元素的数量(对于set
,只能是 0 或 1)。
- 访问:
begin()
:返回指向第一个元素的迭代器。end()
:返回指向尾后元素的迭代器。rbegin()
和rend()
:返回反向迭代器。
- 容量相关:
size()
:返回集合中元素的数量。empty()
:判断集合是否为空。
- 其他操作:
clear()
:清空集合。swap(set& other)
:与另一个集合交换内容。
2. multiset
multiset
和 set
类似,但允许存储重复的元素,其他操作基本相同。
特别之处:
- 插入元素:
insert(const T& value)
:可以多次插入相同的值。
- 查找元素:
count(const T& value)
:返回集合中等于value
的元素的数量(可以大于 1)。
- 删除元素:
erase(const T& value)
:删除集合中所有等于value
的元素。
3. unordered_set
unordered_set
是一种无序集合,内部使用哈希表实现。它存储的元素没有顺序,也不允许重复元素。由于是哈希表实现,unordered_set
在平均情况下的插入、删除、查找操作时间复杂度为 O(1)。
常用操作:
- 插入元素:
insert(const T& value)
:将value
插入到集合中,顺序不保证。
- 删除元素:
erase(const T& value)
:删除集合中等于value
的元素。
- 查找元素:
find(const T& value)
:返回指向value
的迭代器,如果未找到则返回end()
。count(const T& value)
:返回集合中等于value
的元素的数量(只能是 0 或 1)。
- 访问:
begin()
和end()
:迭代器遍历顺序不保证。
- 容量相关:
size()
:返回集合中元素的数量。empty()
:判断集合是否为空。
- 其他操作:
clear()
:清空集合。swap(unordered_set& other)
:与另一个集合交换内容。- 哈希相关:
bucket_count()
:返回当前哈希桶的数量。load_factor()
:返回当前的负载因子。
总结:
set
:有序集合,不允许重复元素,基于红黑树。multiset
:有序集合,允许重复元素,基于红黑树。unordered_set
:无序集合,不允许重复元素,基于哈希表。
选择哪种集合取决于你是否需要元素的顺序和是否允许重复元素。如果不关心顺序且不允许重复,unordered_set
通常是最快的选择。如果需要保持元素的顺序,可以选择 set
或 multiset
。