1. 程式人生 > >《泛型程式設計與STL》讀書筆記

《泛型程式設計與STL》讀書筆記

      通讀《泛型程式設計與STL》,總的感覺是這本書前後反差較大,前半部分非常抽象,後半部分-類似一個API速查手冊,相對簡單。

      STL主要涉及三個方面:容器,迭代器,演算法,各自職責為:容器存資料,迭代器取資料,演算法操縱資料。它們之間的簡單關係是:演算法通過迭代器操作容器,容器通過迭代器訪問自身資料元素。可以說,迭代器做到了讓演算法和容器解耦,同時,模板又做到了讓迭代器與資料型別解耦。迭代器起到了關鍵的橋樑作用。

      迭代器按型別來分可分為五類,名稱分別為 InputIterator/OutputIterator/FowardIterator/Bidirectional/RandomAccessIterator。 InputIterator/OutputIterator

是功能最簡單的迭代器,一個為只讀(讀指從容器中取資料),一個為只寫(寫指將資料寫入容器),迭代器只支援向前;FowardIterator可讀可寫,迭代器也是隻支援向前;Bidirectional迭代器支援向前向後兩個方向,和前三個相同,一次只能前進一個位移;RandomAccessIterator的迭代器支援+n操作。除了強兩個,後三個迭代器都是前一個功能的超集,或者說是前一個的refinement。它們之間的相對關係如下:



        舉個例子,不同的演算法對迭代器的要求可能不同:一般的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