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 更適用於需要頻繁查找和去重的場景。