# 【STL-unordered_set】攻略 ###### tags: `STL` ## 一、snordered_set簡介 unordered_set是一個關聯式容器,容器裡面的元素是**唯一**的,具有不重複的特性,而且是**無排序**的容器,unordered_set 容器裡面元素的值是不可修改,但 unordered_set 容器可以插入或刪除元素,unordered_set 的實作方式通常是用**雜湊表(hash table)實作**。 unordered_set的插入、查詢時間複雜度低,但相對的,空間複雜度偏高,若想加快run time又沒有排序要求,可以使用unordered_set。 與之相關的 : * set : [【STL-set】攻略](https://hackmd.io/HEKxJJzfS7GAlx2crUJyxA?view) * map * Unordered_Map ## 二、用法 ### 定義Set 標頭檔須加上 <unordered_set> ```c++=1 std::unordered_set<int> s{1,2,3,4,5}; ``` ```c++=1 int a[5] = {1,2,3,4,5}; std::unordered_set<int> s(a, a+5); ``` ### 插入、刪除、讀取、清空元素 ```c++=1 #include <iostream> #include <unordered_set> int main() { std::unordered_set<int> s; // insert s.insert(2); s.insert(3); s.insert(5); s.insert(1); s.insert(4); // traversal for (int i : s) std::cout << i << ' '; // erase s.erase(2); s.erase(3); s.erase(5); s.erase(1); s.erase(4); // traversal for (int i : s) std::cout << i << ' '; return 0; } ``` ```c++=1 #include <iostream> #include <unordered_set> int main() { std::unordered_set<int> s; // insert s.insert(2); s.insert(3); s.insert(5); s.insert(1); s.insert(4); // traversal for (int i : s) std::cout << i << ' '; // clear s.clear(); // traversal for (int i : s) std::cout << i << ' '; return 0; } ``` ### 判斷元素是否存在 * s.count() : 傳回Boolean值 * s.find() : 傳回指向該數值位址的迭代器 ```c++=1 #include <iostream> #include <unordered_set> int main() { std::unordered_set<int> s; // insert s.insert(2); s.insert(3); s.insert(5); s.insert(1); s.insert(4); if (s.count(3)) std::cout << "3 is available." << '\n'; std::unordered_set<int>::iterator k = s.find(4); if(k != s.end()) std::cout << "4 is available." << '\n'; return 0; } ``` ### 判斷容器是否為空 ```c++=1 #include <iostream> #include <unordered_set> int main() { std::unordered_set<int> s; // insert s.insert(2); s.insert(3); s.insert(5); s.insert(1); s.insert(4); if (s.empty()) std::cout << "empty"; else std::cout << "not empty"; } ```