1. 程式人生 > >C++ 泛型程序設計與STL模板庫(1)---泛型程序設計簡介及STL簡介與結構

C++ 泛型程序設計與STL模板庫(1)---泛型程序設計簡介及STL簡介與結構

urn 向上 隊列 是把 鏈表 需要 input stack 特定

泛型程序設計的基本概念

  • 編寫不依賴於具體數據類型的程序
  • 將算法從特定的數據結構中抽象出來,成為通用的
  • C++的模板為泛型程序設計奠定了關鍵的基礎

術語:概念

  • 用來界定具備一定功能的數據類型。例如:
    • 將“可以比大小的所有數據類型(有比較運算符)”這一概念記為Comparable
    • 將“具有公有的復制構造函數並可以用‘=’賦值的數據類型”這一概念記為Assignable
    • 將“可以比大小、具有公有的復制構造函數並可以用‘=’賦值的所有數據類型”這個概念記作Sortable
  • 對於兩個不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能,那麽就說概念B是概念A的子概念。例如:
    • Sortable既是Comparable的子概念,也是Assignable的子概念

術語:模型

  • 模型(model):符合一個概念的數據類型稱為該概念的模型,例如:
    • int型是Comparable概念的模型。
    • 靜態數組類型不是Assignable概念的模型(無法用“=”給整個靜態數組賦值)

用概念做模板參數名

  • 很多STL的實現代碼就是使用概念來命名模板參數的。
  • 為概念賦予一個名稱,並使用該名稱作為模板參數名。
  • 例如

    • 表示insertionSort這樣一個函數模板的原型:

    • template <class Sortable>
      void insertionSort(Sortable a[], int n);

STL簡介

標準模板庫(Standard Template Library,簡稱STL)提供了一些非常常用的數據結構和算法

STL簡介

  • 標準模板庫(Standard Template Library,簡稱STL)定義了一套概念體系,為泛型程序設計提供了邏輯基礎
  • STL中的各個類模板、函數模板的參數都是用這個體系中的概念來規定的。
  • 使用STL的模板時,類型參數既可以是C++標準庫中已有的類型,也可以是自定義的類型——只要這些類型是所要求概念的模型。

STL的基本組件

  • 容器(container)
  • 叠代器(iterator)
  • 函數對象(function object)
  • 算法(algorithms)

STL的基本組件間的關系

  • Iterators(叠代器)是算法和容器的橋梁。
    • 將叠代器作為算法的參數、通過叠代器來訪問容器而不是把容器直接作為算法的參數。
  • 函數對象作為算法的參數而不是將函數所執行的運算作為算法的一部分。
  • 使用STL中提供的或自定義的叠代器和函數對象,配合STL的算法,可以組合出各種各樣的功能。

技術分享

STL的基本組件——容器(container)

  • 容納、包含一組元素的對象。
  • 基本容器類模板
    • 順序容器
      • array(數組)、vector(向量)、deque(雙端隊列)、forward_list(單鏈表)、list(列表)
    • (有序)關聯容器
      • set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
    • 無序關聯容器
      • unorderedset (無序集合)、unorderedmultiset(無序多重集合)
      • unorderedmap(無序映射)、unordermultimap(無序多重映射)
  • 容器適配器
    • stack(棧)、queue(隊列)、priority_queue(優先隊列)
  • 使用容器,需要包含對應的頭文件

STL的基本組件——叠代器(iterator)

  • 叠代器是泛化的指針,提供了順序訪問容器中每個元素的方法
  • 提供了順序訪問容器中每個元素的方法;
  • 可以使用“++”運算符來獲得指向下一個元素的叠代器;
  • 可以使用“*”運算符訪問一個叠代器所指向的元素,如果元素類型是類或結構體,還可以使用“->”運算符直接訪問該元素的一個成員;
  • 有些叠代器還支持通過“--”運算符獲得指向上一個元素的叠代器;
  • 叠代器是泛化的指針:指針也具有同樣的特性,因此指針本身就是一種叠代器;
  • 使用獨立於STL容器的叠代器,需要包含頭文件。

STL的基本組件——函數對象(function object)

  • 一個行為類似函數的對象,對它可以像調用函數一樣調用。
  • 函數對象是泛化的函數:任何普通的函數和任何重載了“()” 運算符的類的對象都可以作為函數對象使用
  • 使用STL的函數對象,需要包含頭文件

STL的基本組件——算法(algorithms)

  • STL包括70多個算法
    • 例如:排序算法,消除算法,計數算法,比較算法,變換算法,置換算法和容器管理等
  • 可以廣泛用於不同的對象和內置的數據類型。
  • 使用STL的算法,需要包含頭文件。
  • 例10-1從標準輸入讀入幾個整數,存入向量容器,輸出它們的相反數

STL程序實例

transform算法的一種實現:

template <class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op) {
    for (;first != last; ++first, ++result)
        *result = op(*first);
    return result;
}
  • transform算法順序遍歷firstlast兩個叠代器所指向的元素;
  • 將每個元素的值作為函數對象op的參數;
  • 將op的返回值通過叠代器result順序輸出;
  • 遍歷完成後result叠代器指向的是輸出的最後一個元素的下一個位置,transform會將該叠代器返回

本文內容參考自C++語言程序設計(第4版),鄭莉,清華大學出版社

C++ 泛型程序設計與STL模板庫(1)---泛型程序設計簡介及STL簡介與結構