1. 核心特性
• 唯一性:元素自動去重,不允許重複值。
• 有序性:元素默認按升序排列(可通過自定義比較器改變順序)。
• 不可修改:元素值不可直接修改(可能破壞排序),需先刪除再插入新值。
• 關聯容器:通過鍵(即元素本身)訪問,支持高效查詢(對數時間複雜度)。
2. 底層實現
通常基於紅黑樹(平衡二叉搜索樹)實現,保證插入、刪除、查找的時間複雜度均為 O(log n)。
3. 基本操作示例
#include <iostream>
#include <set>
using namespace std;
int main() {
// 聲明set
set<int> mySet;
// 插入元素
mySet.insert(3);
mySet.insert(1);
mySet.insert(4);
mySet.insert(1); // 重複元素不會被插入
// 遍歷輸出(自動排序)
for (int num : mySet) {
cout << num << " "; // 輸出:1 3 4
}
cout << endl;
// 查找元素
auto it = mySet.find(3);
if (it != mySet.end()) {
cout << "Found: " << *it << endl;
}
// 刪除元素
mySet.erase(3); // 刪除值為3的元素
// 其他常用操作
cout << "Size: " << mySet.size() << endl; // 元素個數
cout << "Empty: " << mySet.empty() << endl; // 是否為空
mySet.clear(); // 清空set
return 0;
}
4. 自定義排序規則
set 的完整模板聲明是:
template <class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
class set;
其中:
• 第一個參數 Key:元素的類型(這裏是 int)
• 第二個參數 Compare:比較函數的類型(這裏是 DescendingCompare)
#include <iostream>
#include <set>
using namespace std;
// 自定義降序比較器
struct DescendingCompare {
bool operator()(int a, int b) const {
return a > b; // 降序:a > b 時 a 排在前面
}
};
int main() {
set<int, DescendingCompare> descSet;
descSet.insert({5, 2, 8, 1, 9});
for (int num : descSet) {
cout << num << " "; // 輸出:9 8 5 2 1
}
cout << endl;
return 0;
}
5. 常用成員函數
insert(value) 插入元素
erase(value) 刪除指定元素
find(value) 查找元素,返回迭代器
count(value) 返回元素個數(0或1)
lower_bound() 返回第一個不小於值的迭代器
upper_bound() 返回第一個大於值的迭代器
begin()/end() 返回首尾迭代器
6. 相關容器
• multiset:允許重複元素的有序集合。
• unordered_set:基於哈希表的無序集合(查詢更快,但無序)。
7. 注意事項
• 插入/刪除操作不會使迭代器失效(被刪除元素的迭代器除外)。
• 元素類型需支持比較(或提供自定義比較器)。
• 相比 vector/array,set 更適用於需要頻繁查找和去重的場景。