《泛型程式設計與STL》讀書筆記
通讀《泛型程式設計與STL》,總的感覺是這本書前後反差較大,前半部分非常抽象,後半部分-類似一個API速查手冊,相對簡單。
STL主要涉及三個方面:容器,迭代器,演算法,各自職責為:容器存資料,迭代器取資料,演算法操縱資料。它們之間的簡單關係是:演算法通過迭代器操作容器,容器通過迭代器訪問自身資料元素。可以說,迭代器做到了讓演算法和容器解耦,同時,模板又做到了讓迭代器與資料型別解耦。迭代器起到了關鍵的橋樑作用。
迭代器按型別來分可分為五類,名稱分別為 InputIterator/OutputIterator/FowardIterator/Bidirectional/RandomAccessIterator。 InputIterator/OutputIterator
舉個例子,不同的演算法對迭代器的要求可能不同:一般的find演算法,只需要一個InputIterator就可以了;對於replace演算法,在讀的同時還需要寫,則至少需要是FowardIterator。下面的例子,square方法中的ForwardIterator可以換成InputIterator或OutputIterator嗎?答案是不可以,因為需要可讀可寫。
#include <iostream> #include <fstream> #include <iterator> #include <vector> using namespace std; template<typename ForwardIterator> void square(ForwardIterator first, ForwardIterator last) { cout << "Squares: "; for(;first != last; first++) { *first = (*first) * (*first); cout << *first << " "; } cout << endl; } int main() { int arr[] = {1, 2, 3, 4, 5}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0])); cout << "Elements: "; for(auto it : v ) { cout << it << " "; } cout << endl; square(v.begin(), v.end()); return 0; }
TBD