std::set 是關聯式容器,內部以紅黑樹實現,元素自動排序且唯一(無重複)。
insert()返回 pair<iterator, bool>:
second 為 true 表示插入成功(原無該值)。second 為 false 表示已存在,first 指向現有元素。使用迭代器:
[cpp]
for (auto it = s.begin(); it != s.end(); ++it)
cout << *it << ' ';
find() / count()find(val) 返回迭代器,若不存在則返回 end()。count(val) 返回 0 或 1(因元素唯一)。[cpp]
#include <iostream>
#include <string>
#include <set>
using namespace std;
void printSet(const set& s) {
for (int val : s) cout << val << ' ';
cout << '\n';
}
int main() {
set s1;
for (int i = 0; i < 5; ++i) s1.insert(i * 10); // 0 10 20 30 40
printSet(s1);
// 嘗試插入重複值 20
cout << "s1.insert(20).second = " << s1.insert(20).second << '\n'; // 0
if (s1.insert(20).second) cout << "Insert OK!\n";
else cout << "Insert Failed!\n"; // 輸出此行
// 插入新值 50
cout << "s1.insert(50).second = " << s1.insert(50).second << '\n'; // 1
if (s1.insert(50).second) {
cout << "Insert OK!\n";
printSet(s1); // 0 10 20 30 40 50
} else cout << "Insert Failed!\n";
// 使用 pair 接收返回值
pair::iterator, bool> p = s1.insert(60);
if (p.second) {
cout << "Insert OK!\n";
printSet(s1); // 0 10 20 30 40 50 60
} else cout << "Insert Failed!\n";
return 0;
}
原文中的遍歷寫法 for(i=s.begin(); i>=s.end(); i++) 有誤,正確為 i != s.end()。
set 適合「唯一、有序、頻繁查找」場景。O(log n)。insert 返回值判斷是否真正插入。