# 進階C++: # iterator ### 2021/12/17 電算社第十一堂社課 --- ## 迭代器 iterator ---- 一種類似指標的東東,和指標一樣存的是記憶體位置,使用方法和指標也差不多,通常使用vector時會跟著iterator一起使用,而非pointer ---- ### 指標 v.s Iterator ![](https://i.imgur.com/C5nnWCj.png) ---- ### 種類 * 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}]"}
    234 views
   Owned this note