std::set 是有序關聯容器,元素唯一、自動按比較函數排序(默認 less,升序)。底層為紅黑樹,查找/插入/刪除均為 O(log n)。不允許直接修改元素值(會破壞順序),需刪除後重新插入。
| 函數 | 說明 |
|---|---|
begin()/end() | 返回首/尾後迭代器 |
insert(val) | 插入元素,返回 pair<iterator,bool> |
erase(pos/val) | 按迭代器或值刪除 |
find(val) | 查找元素,未找到返回 end() |
lower_bound(val) | 首個 ≥ val 的迭代器 |
upper_bound(val) | 首個 > val 的迭代器 |
equal_range(val) | 返回 [lower, upper) 範圍 |
size()/empty() | 元素個數/是否為空 |
clear() | 清空容器 |
swap(other) | 交換兩個 set |
set s;
s.insert(8); s.insert(1); s.insert(12); s.insert(6); s.insert(8); // 重複忽略
for (int x : s) cout << x << ' '; // 輸出: 1 6 8 12
方式一:函數對象
struct Desc { bool operator()(int a, int b) const { return a > b; } };
set s2; // 降序
方式二:結構體內重載 operator<
struct Info {
string name; double score;
bool operator<(const Info& other) const { return score > other.score; } // 分數降序
};
set s3;
set A, B, U, I, D, SD;
set_union(A.begin(), A.end(), B.begin(), B.end(), inserter(U, U.begin()));
set_intersection(A.begin(), A.end(), B.begin(), B.end(), inserter(I, I.begin()));
set_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(D, D.begin()));
set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), inserter(SD, SD.begin()));