c++ set 教學 | 用法及範例

c++ set 教學
set 裡的元素有不重複的特性,且元素已排序(底層以紅黑樹實作)
另一種是 unordered_set,一樣有不重複的特性,但無排序(底層以 hash table 實作)

建立 set

  • #include <set> : 引入 set
  • set<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) 插入 set
  • s.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 或 1
  • s.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;
}