C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构
| 輸入迭代器 | 只讀,不寫;單遍掃描,只能遞增 |
| 輸出迭代器 | 只寫,不讀;單遍掃描,只能遞增 |
| 前向迭代器 | 可讀寫,多遍掃描,只能遞增 |
| 雙向迭代器 | 可讀寫,多遍掃描,可遞增遞減 |
| 隨機訪問迭代器 | 可讀寫,多遍掃描,支持全部迭代器運算 |
1. 輸入迭代器(input iterator)
支持的操作集:==, !=, 前綴++, 后綴++, *, ->。
eg1. istream_iterator是一種輸入迭代器
eg2. find, accumulate算法要求輸入迭代器
2. 輸出迭代器(output iterator)
支持的操作集:前綴++, 后綴++, *(只能出現在賦值運算的左操作數上)。
推出迭代器要求每個迭代器必須正好寫入一次。
eg1. ostream_iterator是輸出迭代器
eg2. copy算法需要操作輸出迭代器v2。
3. 前向迭代器(forward iterator)
讀和寫,只能沿一個方向移動,支持輸入迭代器和輸出迭代器提供的所有操作,還支持對同一個元素的多次讀寫。例如,replace算法
eg. replace需要這種迭代器。
vector<int> v2 = { 4,5,6,7,8,9,4 }; int a1[] = { 0,1,2,3,4,5,6 }; replace(v2.begin(), v2.end(), 4, 42); for (auto it : v2) cout << " " << it;replace_copy 前兩個參數必須是輸入迭代器,第3個參數得是輸出迭代器。
replace_copy(v2.cbegin(), v2.cend(), back_inserter(v3), 4, 42);forward_list forward_list<int> vi = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; auto prev = vi.before_begin();4. 雙向迭代器(bidirectional iterator)
讀和寫,除了支持前向迭代器的所有操作,還支持反向和正向、即是前綴–和后綴–,即支持雙向遍歷容器。
例如,reverse算法要求這類迭代器。標準庫容器中提供的迭代器都至少達到雙向迭代器的要求。
5. 隨機訪問迭代器(random-access iterator)
讀和寫。提供在常量時間內訪問容器任意位置的功能。
支持完整的迭代器操作集:
1)關系運算:==, !=, <, <=, >, >=;
2)算術運算:it + n, it - n, it += n, it -= n以及it1 - it2;
3)下標運算:it[n],等價于*(it + n)。需要隨機訪問迭代器的泛型算法包括sort算法。例如,vector, deque, string迭代器是隨機訪問迭代器,用作訪問內置數組元素的指針也是隨機訪問迭代器。
6. 總結
除了輸出迭代器,其他類別的迭代器形成了一個層次結構:需要低級類別迭代器的地方,可使用任意一種更高級的迭代器。例如,對于需要輸入迭代器的算法,可傳遞前向、雙向或隨機訪問迭代器調用該算法。而反之則不行。注意:向算法傳遞無效的迭代器類別所引起的錯誤,無法保證會在編譯時被捕獲到。
map, set, list類型提供雙向迭代器
string, vector和deque容器上的迭代器都是隨機訪問迭代器
用作訪問內置數組元素的指針也是隨機訪問迭代器。
另外,雖然map和set類型提供雙向迭代器,但關聯容器不能使用任何寫序列元素的算法。只能使用與關聯容器綁在一起的迭代器來提供用于讀操作的實參。因此,在處理算法時,最好將關聯容器上的迭代器視為支持自減運算的輸入迭代器,而不是完整的雙向迭代器。
總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(10)
- 下一篇: C++ Primer 5th笔记(cha