泛型編程 整理筆記

C++ 中, 模板使得算法獨立於存儲的數據類型, 而迭代器使算法獨立於使用的容器類型.
比如 find_key 函數, 存儲的數據結構可能是數組, 或者是鏈表
模板提供了存儲在容器中的數據類型的通用表示, 而迭代器提供了遍歷容器中的值的通用表示.


STL 中:

  • 每個容器定義了相應的迭代器類型, 可能是 指針對象
  • 迭代器都定義了所需的操作, 如 * 操作或者 ++ 操作
  • 每個容器類都有一個 超尾標記, 當迭代器遞增到超越容器的地一個值後, 這個值將被賦給迭代器

還未搞懂, 歡迎懂的人指教: 實際上, 作爲一種編程風格, 最好避免直接使用迭代器, 而應儘可能使用 STL 函數(如 for_each( ) )來處理細節, 也可以使用 C++ 11 新增加的基於範圍的 for 循環: for(auto s: scores) cout << x << endl;


迭代器類型

遍歷時, 希望迭代器能夠讀取數據, 但是不希望能夠寫數據, (只看不修改)
排序時, 希望迭代器能夠隨機訪問, 以交換兩個不相鄰的元素
因此, STL 定義了 5 種迭代器
輸入迭代器, 輸出迭代器, 正向迭代器, 雙向迭代器, 隨機訪問迭代器
這五種迭代器, 都可以執行接觸引用操作, 即爲它們定義了 * 運算符

  1. 輸入迭代器: 來自容器中的信息被視爲輸入, 可以被程序用來讀取容器中的信息, 但是不一定能讓程序修改值, 輸入迭代器是單向迭代器, 可以遞增, 但不能倒退

  2. 輸出迭代器: 將信息從程序傳輸給迭代器, 即程序的輸出就是容器的輸入, 它與輸入迭代器類似, 只是解除引用讓程序能修改容器值, 而不能讀取

  3. 正向迭代器只使用 ++ 運算符來遍歷容器, 每次向前移動一個元素, 與輸入和輸出迭代器不同的是, 它總是按相同的順序遍歷i一系列值. 正向迭代器能夠讀取和修改數據, 也可以只能讀取數據:

  int * pre;    // read-write iterator
  const int * pre    // read-only iterator
  1. 雙向迭代器: 具有正向迭代器的所有特性, 同時支持兩種(前綴和後綴)遞減運算符
  2. 隨機訪問迭代器: 有些算法, 如排序和二分搜索, 要求隨機訪問容器, 具有雙向迭代器的所有特性, 同時添加了支持隨機訪問的操作(如指針增加的運算), 和用於對元素進行排序的關係運算符

在編寫算法儘可能使用要求最低的迭代器, 並讓它適用於容器的最大區間


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章