## set
c++ 中的`set`其實也是一集合(set),功能是會自動排序並且不會儲存一樣的元素
### 特性
1. 動態調整記憶體大小(不用事先定義大小)
2. 自動排序以及相同元素只會有一個
## 使用時機
1. 需要整理一堆數據但只需要知道裡面有哪些數據的
## 程式碼區
### 1. 函式庫引入
```cpp=
#include <set>
```
### 2. 初始化
1. 基本定義
```=
set<資料型態>名字;
```
:::warning
1. 名字不能是保留字 [C++ 筆記: 保留字](/80Y4ImqXQGGTQvr3gqbTYA)
2. 資料型態不一定只有`int`、`char`之類的,像`set`、`stack` 也可以當資料型態喔
範例 :
```cpp=
vector<set>vec;
```
:::
ex:
```cpp=
set<int>st;
```
2. 定義陣列裡內容
```cpp=
// 1
set<int>st({1, 2, 3});
// 2
set<int>st = {1, 2, 3};
```
3. 複製全部陣列
```cpp=
// 1
set<int>st1({1, 2, 3});
set<int>st2 = st1;
// 2
set<int>st({1, 2, 3});
set<int>st2(st1);
```
4. 複製部分陣列(運用[迭代器](###迭代器))
```cpp=
set<int>st1({1, 2, 3, 4, 5});
auto it = st1.begin(); // 迭代器(iterator)
set<int>st2(it, it+3); //st1[0] ~ st[2]
//st2 = {1, 2, 3};
```
5. 從傳統陣列轉為set
```cpp=
int mp[3] = {1, 2, 3};
set<int>st = (mp, mp+3);
```
6. 複製部分傳統陣列
```cpp=
int mp[5] = {1, 2, 3, 4, 5};
set<int>st(n+2, n+4); // //mp[2] ~ mp[3]
//st = {3, 4}
```
### 3. 讀取陣列中元素 (只能用迭代方法)
```cpp=
set<int>st({1, 2, 3});
// 1(推薦,超好用的)
for (auto v : st)
cout << v << " "; // 1 2 3
// 2(盡量用auto 來代替,但建議只有迴圈跟迭代器這樣用,否則你的程式碼可讀性會變得很低)
for (set<int>v : st)
cout << v << " "; // 1 2 3
```
### 4. 增減元素
1. 新增特定位置(運用[迭代器](###迭代器))
```cpp=
// 1個
set<int>st({1, 2, 3});
st.insert(4); // st = {1, 2, 4, 3}
//多個
set<int>st1({1, 2, 3});
set<int>st2({4, 5, 6});
st1.insert(st1.begin() + 1, st2.begin(), st2.end());
//st1 = {1, 2, 3, 4, 5, 6}
```
4. 刪除特定位置(運用[迭代器](###迭代器))
```cpp=
set<int>st({1, 2, 3});
st.erase(st.begin(), st.end()); //st = {}
set<int>st1({1, 2, 3});
set<int>st2({2, 3, 4});
st1.erase(st2.begin(), st2.end()); //st1 = {1}
```
### 5. 迭代器
> 通常搭配迴圈以及條件式使用,也可以用來取某段陣列中的元素
```cpp=
set<int>st({1, 2, 3});
//1. st.begin() : 取第一個的前面一個(從第一開始)
cout << st.begin();
//2. st.end() : 0 取最後一個的後面一個(從第一開始)
cout << st.end();
```
### 7. 其他函式
1. 判斷長度 `.size()`
> 通常搭配`for`迴圈做使用,當最迴圈的中止條件
```cpp=
set<int>st({1, 2, 3});
cout << st.size(); // 3
```
2. 判斷是否為空 `.empty()`
> 通常搭配`if`、`while`之類的條件是做使用
```cpp=
set<int>st({1, 2, 3});
cout << st.empty(); // 0(false)
```
3. 清空set陣列
```cpp=
set<int>st({1, 2, 3})
st.clear() // st = {}
```