# 【STL-set】攻略 ###### tags: `STL` ## 一、Set簡介 Set是一個關聯式容器,容器裡面的元素是**唯一**的,具有不重複的特性,而且是**有排序**的容器,set 容器裡面元素的值是不可修改,但 set 容器可以插入或刪除元素,set 的實作方式通常是用**紅黑樹(red-black tree)實作**。 與之相關的 : * unordered_set : [【STL-unordered_set】攻略](https://hackmd.io/WQ9jJ1QoR3ugwQLDLY0RfQ) * map * unordered_map ## 二、用法 ### 定義Set ```c++=1 std::set<int> s{1,2,3,4,5}; ``` ```c++=1 int a[5] = {1,2,3,4,5}; std::set<int> s(a, a+5); ``` ### 插入、刪除、讀取、清空元素 ```c++=1 #include <iostream> #include <set> int main() { std::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 <set> int main() { std::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 <set> int main() { std::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::set<int>::iterator k = s.find(4); if(k != s.end()) std::cout << "4 is available." << '\n'; return 0; } ``` ### 判斷容器是否為空 ```c++=1 #include <iostream> #include <set> int main() { std::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"; } ```