在C++中,set 和 multiset 是基于红黑树实现的关联容器,它们自动保持元素的排序。这两种容器主要用于快速查找、插入和删除操作,其中元素自动排序且唯一(对于 set)或允许重复(对于 multiset)。下面详细介绍这两种容器的使用和相关算法。
set
set 是一个集合,其中所有元素都是唯一的,并且自动按照特定的顺序排序。
基本操作
-
创建和初始化
#include <set> std::set<int> s = {1, 2, 3, 4}; -
插入元素
s.insert(5); // 插入元素5 -
删除元素
s.erase(3); // 删除元素3 -
查找元素
auto it = s.find(4); // 查找元素4 if (it != s.end()) { // 找到元素 } -
遍历
for (int x : s) { std::cout << x << " "; }
特性
- 元素唯一。
- 元素按照指定的排序准则(默认为小于)排序。
- 提供高效的查找、插入和删除操作。
multiset
multiset 与 set 类似,但它允许存储重复的元素。
基本操作
-
创建和初始化
std::multiset<int> ms = {1, 2, 2, 3, 4}; -
插入元素
ms.insert(2); // 插入元素2 -
删除元素
ms.erase(2); // 删除所有的2 ms.erase(ms.find(2)); // 删除一个2 -
查找元素
auto it = ms.find(2); // 查找元素2 if (it != ms.end()) { // 找到元素 } -
计数元素
int count = ms.count(2); // 计算元素2的数量 -
遍历
for (int x : ms) { std::cout << x << " "; }
特性
- 允许重复元素。
- 元素按照指定的排序准则排序。
- 提供高效的查找、插入和删除操作。
相关算法
由于 set 和 multiset 是基于红黑树实现的,它们的很多操作(如插入、删除、查找)都是对数时间复杂度。这使得它们非常适合需要频繁执行这些操作的场景。此外,可以使用标准算法(如 std::for_each, std::transform 等)来操作这些容器,但要注意这些操作不会改变容器中元素的排序。
使用场景
- 当需要一个总是排序的集合时,
set和multiset是很好的选择。 set适用于需要唯一元素的场景。multiset适用于可能需要重复元素的场景。
这些容器的自动排序和高效的查找特性使它们在实际应用中非常有用,如在数据库查询、统计数据中的元素计数、去重等场景。

被折叠的 条评论
为什么被折叠?



