set 裡的元素有不重複的特性,且元素已排序(底層以紅黑樹實作)
另一種是 unordered_set,一樣有不重複的特性,但無排序(底層以 hash table 實作)
建立 set
#include <set>: 引入 setset<dataType> s: 宣告set<dataType> s={data1, data2}: 宣告 + 初始化
使用範例 :
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s1; // s1 = {}
set<int> s2={1, 2, 3}; // s2 = {1, 2, 3}
return 0;
}
新增及刪除元素
s.insert(val): 將元素(val) 插入 sets.erase(val): 將元素(val) 從 set 移除,回傳刪除的元素數量(0 or 1)s.clear(): 清空所有元素
使用範例 :
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s;
s.insert(1); // s = {1}
s.insert(2); // s = {1, 2}
s.insert(2); // s = {1, 2} (2 重複插入)
s.erase(1); // s = {2}
s.clear(); // s = {}
}
查詢元素是否存在
set 不支援隨機存取(沒有 operator[]),因為底層不是連續記憶體,但可以查詢元素存不存在 set 裡
s.count(val): 查詢 val 是否存在,回傳 0 或 1s.find(val): 回傳 val 的 iterator (找不到則回傳.end())
使用範例 :
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s={1, 2, 3, 4, 5};
cout<<s.count(1)<<endl; // 1
cout<<s.count(6)<<endl; // 0
cout<<s.find(1) != s.end()<<endl; // 1
cout<<s.find(6) != s.end()<<endl; // 0
return 0;
}
走訪 set
下列方法都可以用~
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s={3, 1, 4, 2, 5};
// method 1
for(int num: s){
cout<<num<<" "; // 1 2 3 4 5 (有排序)
}
cout<<endl;
// method 2
for(auto iter=s.begin(); iter!=s.end(); iter++){
cout<<*iter<<" "; // 需要 dereference
}
cout<<endl;
return 0;
}
其他
s.size(): s 的大小s.empty(): 判斷 s 是不是空的
使用範例 :
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s={1,2,3,4,5};
cout<<s.size()<<endl; // 5
cout<<s.empty()<<endl; // 0 (false)
return 0;
}
unordered set
使用上基本和 set 一樣,把 set 改成 unordered_set 即可
unordered_set 與 set 差異:
- set:有序(紅黑樹),查找 O(log n)
- unordered_set:無序(hash table),查找 O(1)
使用範例 :
#include <iostream>
#include <unordered_set>
using namespace std;
int main(){
unordered_set<int> s={3, 1, 4, 2, 5};
for(int num: s){
cout<<num<<" "; // 5 2 4 1 3 (無排序)
}
cout<<endl;
return 0;
}