# 進階C++:
# iterator
### 2021/12/17 電算社第十一堂社課
---
## 迭代器 iterator
----
一種類似指標的東東,和指標一樣存的是記憶體位置,使用方法和指標也差不多,通常使用vector時會跟著iterator一起使用,而非pointer
----
### 指標 v.s Iterator

----
### 種類
* bidirectional iterator:可以前後移
* 只能往前後移一格
* 大部分不能隨機存取的資料結構(set)
* random access iterator:可以亂跳
* 可以往前後跳任意格
* 可以相減算距離
* 可以隨機存取的資料結構(vector deque)
----
函式庫
基本上可以使用iterator的資料結構,該資料型態的函式庫就有iterator
ex.
```cpp=
#include <vector>
#include <deque>
#include <set>
```
宣告
```cpp=
資料結構<type>::iterator i;
auto i = v.begin(); // 一定要賦值
```
---
## 用法
----
### vector
```cpp=
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> v = {4,8,7,6,3};
vector<int>::iterator i; // random access iterator
// 或 auto i = v.begin();
for(i = v.begin(); i != v.end(); i++){
cout << *i << ' ';
}
cout << v.end() - v.begin(); // 5,即v.size()
//輸出:4 8 7 6 3
cout << endl << *(i - 1); //3
cout << endl << *(i - 2); //6
cout << endl << *(i - 3); //7
return 0;
}
```
----
### deque
```cpp=
#include <iostream>
#include <deque>
using namespace std;
int main(){
deque<int> dq = {4,8,7,6,3};
deque<int>::iterator i = dq.begin();
// random access iterator
// auto i = dq.begin();
cout << *i << '\n'; // 4
cout << *(i + 1) << '\n'; // 8
i++;
cout << *(i + 2) << '\n'; // 6
return 0;
}
```
----
### set
```cpp=
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s;
for(int j = 0; j < 5; j++){
s.insert(j);
}
set<int>::iterator i; //bidirectional iterator
// auto i = s.begin();
for(i = s.begin(); i != s.end(); i++){
cout << *i << ' '; // 0 1 2 3 4
}
set<int>::iterator i2 = s.begin();
cout << *i2 << '\n'; // 0
//i2 += 2(會爆掉)
i2++;
cout << *i2 << '\n'; // 1
return 0;
}
```
---
### 會用到iterator的function
----
* sort
* lower_bound
* upper_bound
----
```cpp=
vector<int> a = {4, 8, 7, 6, 3};
sort(a.begin(), a.end()); // {3, 4, 6, 7, 8}
vector<int> b = {4, 8, 7, 6, 3};
sort(b.begin() + 2, b.end()); // {4, 8, 3, 6, 7}
vector<int> c = {4, 8, 7, 6, 3};
sort(c.begin() + 1, c.end() - 2); // {4, 7, 8, 6, 3}
vector<int> d = {4, 8, 7, 6, 3};
sort(d.begin() + 1, d.begin() + 3); // {4, 7, 8, 6, 3}
```
{"metaMigratedAt":"2023-06-16T16:11:41.138Z","metaMigratedFrom":"YAML","title":"進階C++:Iterator","breaks":true,"slideOptions":"{\"transition\":\"slide\",\"theme\":null}","contributors":"[{\"id\":\"4a2636eb-4e67-4bed-8022-8aa0dfe853fb\",\"add\":1,\"del\":0},{\"id\":\"4f731eff-9d88-41f4-af56-2e3e02f20cfc\",\"add\":2447,\"del\":7}]"}