04-数据结构/05-set与unordered set

来自三三百科
33DAI留言 | 贡献2026年5月20日 (三) 16:25的版本 (导入1个版本)
跳转到导航 跳转到搜索

set 采用红黑树实现(有序),unordered_set 采用哈希表实现(无序)。

set

集合中的元素唯一有序

定义

set<int> s;                // 存 int 的集合(默认升序)
set<int, greater<int>> s;  // 降序排列
set<string> ss[30];        // 30 个集合

常用操作

操作 说明
s.insert(x) 插入元素(已存在则插入失败)
s.erase(x) 删除元素
s.find(x) 查找元素,不存在返回 s.end()
s.count(x) 判断元素是否存在(返回 [math]\displaystyle{ 0 }[/math][math]\displaystyle{ 1 }[/math]
s.clear() 清空
s.size() 返回元素数量
s.empty() 判断是否为空

枚举

// 迭代器
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
    cout << *it << "\n";

// 范围 for
for (auto now : s)
    cout << now << "\n";

二分查找

set 支持二分查找(红黑树特性):

auto it = s.lower_bound(x); // 第一个 >= x 的元素
auto it = s.upper_bound(x); // 第一个 > x 的元素

unordered_set

- 基于哈希表,插入/查找/删除平均 [math]\displaystyle{ O(1) }[/math] - 元素无序 - 用法与 set 基本相同

unordered_set<int> s;
s.insert(5);
if (s.find(5) != s.end())
    cout << "找到了";

multiset

允许重复元素的集合:

multiset<int> ms;
ms.insert(1);
ms.insert(1); // 允许重复
ms.erase(ms.find(1)); // 只删除一个 1(如果 erase(1) 会删除所有)

选择建议

- 需要有序且不重复:用 set - 需要有序且可重复:用 multiset - 只需要查重不关心顺序:用 unordered_set