---
# System prepended metadata

title: 'C++筆記 : 函式庫 - set'
tags: [C++ 函式庫]

---

## 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 = {}
```