1. 程式人生 > >C++ STL中的資料結構和演算法

C++ STL中的資料結構和演算法

STL資料結構

STL資料結構[1] 以STL容器(Container)的形式提供,主要包括序列式容器(Sequence Containers)和關聯式容器(Associative Containers)兩大類。

序列式容器

  • array(build-in):定長陣列,C++內建
  • vector
    • heap:以演算法形式呈現,包含在STL演算法中
      • priority-queue
  • list
  • slist:非STL標準
  • deque
    • stack:配接器
    • queue:配接器

關聯式容器

  • RB-tree:非公開的,STL內部使用
    • set
    • map
    • multiset
    • multimap
  • hashtable
    • hash-set
    • hash-map
    • hash-multiset
    • hash-multimap

以上列表中的層次關係代表容器間的內含關係,例如heap中內含一個vector,priority-queue中內含一個heap,set、map中都內含一個RB-tree。

STL演算法

STL演算法[2]部分主要由標頭檔案,,組成。要使用 STL中的演算法函式必須包含標頭檔案,對於數值演算法須包含,中則定義了一些模板類,用來宣告函式物件。

STL中演算法大致分為四類:

  • 1、非可變序列演算法:指不直接修改其所操作的容器內容的演算法。
  • 2、可變序列演算法:指可以修改它們所操作的容器內容的演算法。
  • 3、排序演算法:包括對序列進行排序和合並的演算法、搜尋演算法以及有序序列上的集合操作。
  • 4、數值演算法:對容器內容進行數值計算。

以下對所有演算法進行細緻分類並標明功能:

<一>查詢演算法(13個):判斷容器中是否包含某個值

  • adjacent_find: 在iterator對標識元素範圍內,查詢一對相鄰重複元素,找到則返回指向這對元素的第一個元素的ForwardIterator。否則返回last。過載版本使用輸入的二元操作符代替相等的判斷。
  • binary_search: 在有序序列中查詢value,找到返回true。過載的版本實用指定的比較函式物件或函式指標來判斷相等。
  • count: 利用等於操作符,把標誌範圍內的元素與輸入值比較,返回相等元素個數。
  • count_if: 利用輸入的操作符,對標誌範圍內的元素進行操作,返回結果為true的個數。
  • equal_range: 功能類似equal,返回一對iterator,第一個表示lower_bound,第二個表示upper_bound。
  • find: 利用底層元素的等於操作符,對指定範圍內的元素與輸入值進行比較。當匹配時,結束搜尋,返回該元素的一個InputIterator。
  • find_end: 在指定範圍內查詢”由輸入的另外一對iterator標誌的第二個序列”的最後一次出現。找到則返回最後一對的第一個ForwardIterator,否則返回輸入的”另外一對”的第一個ForwardIterator。過載版本使用使用者輸入的操作符代替等於操作。
  • find_first_of: 在指定範圍內查詢”由輸入的另外一對iterator標誌的第二個序列”中任意一個元素的第一次出現。過載版本中使用了使用者自定義操作符。
  • find_if: 使用輸入的函式代替等於操作符執行find。
  • lower_bound: 返回一個ForwardIterator,指向在有序序列範圍內的可以插入指定值而不破壞容器順序的第一個位置。過載函式使用自定義比較操作。
  • upper_bound: 返回一個ForwardIterator,指向在有序序列範圍內插入value而不破壞容器順序的最後一個位置,該位置標誌一個大於value的值。過載函式使用自定義比較操作。
  • search: 給出兩個範圍,返回一個ForwardIterator,查詢成功指向第一個範圍內第一次出現子序列(第二個範圍)的位置,查詢失敗指向last1。過載版本使用自定義的比較操作。
  • search_n: 在指定範圍內查詢val出現n次的子序列。過載版本使用自定義的比較操作。

<二>排序和通用演算法(14個):提供元素排序策略

  • inplace_merge: 合併兩個有序序列,結果序列覆蓋兩端範圍。過載版本使用輸入的操作進行排序。
  • merge: 合併兩個有序序列,存放到另一個序列。過載版本使用自定義的比較。
  • nth_element: 將範圍內的序列重新排序,使所有小於第n個元素的元素都出現在它前面,而大於它的都出現在後面。過載版本使用自定義的比較操作。
  • partial_sort: 對序列做部分排序,被排序元素個數正好可以被放到範圍內。過載版本使用自定義的比較操作。
  • partial_sort_copy: 與partial_sort類似,不過將經過排序的序列複製到另一個容器。
  • partition: 對指定範圍內元素重新排序,使用輸入的函式,把結果為true的元素放在結果為false的元素之前。
  • random_shuffle: 對指定範圍內的元素隨機調整次序。過載版本輸入一個隨機數產生操作。
  • reverse: 將指定範圍內元素重新反序排序。
  • reverse_copy: 與reverse類似,不過將結果寫入另一個容器。
  • rotate: 將指定範圍內元素移到容器末尾,由middle指向的元素成為容器第一個元素。
  • rotate_copy: 與rotate類似,不過將結果寫入另一個容器。
  • sort: 以升序重新排列指定範圍內的元素。過載版本使用自定義的比較操作。
  • stable_sort: 與sort類似,不過保留相等元素之間的順序關係。
  • stable_partition: 與partition類似,不過不保證保留容器中的相對順序。

<三>刪除和替換演算法(15個)

  • copy: 複製序列
  • copy_backward: 與copy相同,不過元素是以相反順序被拷貝。
  • iter_swap: 交換兩個ForwardIterator的值。
  • remove: 刪除指定範圍內所有等於指定元素的元素。注意,該函式不是真正刪除函式。內建函式不適合使用remove和remove_if函式。
  • remove_copy: 將所有不匹配元素複製到一個制定容器,返回OutputIterator指向被拷貝的末元素的下一個位置。
  • remove_if: 刪除指定範圍內輸入操作結果為true的所有元素。
  • remove_copy_if: 將所有不匹配元素拷貝到一個指定容器。
  • replace: 將指定範圍內所有等於vold的元素都用vnew代替。
  • replace_copy: 與replace類似,不過將結果寫入另一個容器。
  • replace_if: 將指定範圍內所有操作結果為true的元素用新值代替。
  • replace_copy_if: 與replace_if,不過將結果寫入另一個容器。
  • swap: 交換儲存在兩個物件中的值。
  • swap_range: 將指定範圍內的元素與另一個序列元素值進行交換。
  • unique: 清除序列中重複元素,和remove類似,它也不能真正刪除元素。過載版本使用自定義比較操作。
  • unique_copy: 與unique類似,不過把結果輸出到另一個容器。

<四>排列組合演算法(2個):提供計算給定集合按一定順序的所有可能排列組合

  • next_permutation: 取出當前範圍內的排列,並重新排序為下一個排列。過載版本使用自定義的比較操作。
  • prev_permutation: 取出指定範圍內的序列並將它重新排序為上一個序列。如果不存在上一個序列則返回false。過載版本使用自定義的比較操作。

<五>算術演算法(4個)

  • accumulate: iterator對標識的序列段元素之和,加到一個由val指定的初始值上。過載版本不再做加法,而是傳進來的二元操作符被應用到元素上。
  • partial_sum: 建立一個新序列,其中每個元素值代表指定範圍內該位置前所有元素之和。過載版本使用自定義操作代替加法。
  • inner_product: 對兩個序列做內積(對應元素相乘,再求和)並將內積加到一個輸入的初始值上。過載版本使用使用者定義的操作。
  • adjacent_difference: 建立一個新序列,新序列中每個新值代表當前元素與上一個元素的差。過載版本用指定二元操作計算相鄰元素的差。

<六>生成和異變演算法(6個)

  • fill: 將輸入值賦給標誌範圍內的所有元素。
  • fill_n: 將輸入值賦給first到first+n範圍內的所有元素。
  • for_each: 用指定函式依次對指定範圍內所有元素進行迭代訪問,返回所指定的函式型別。該函式不得修改序列中的元素。
  • generate: 連續呼叫輸入的函式來填充指定的範圍。
  • generate_n: 與generate函式類似,填充從指定iterator開始的n個元素。
  • transform: 將輸入的操作作用與指定範圍內的每個元素,併產生一個新的序列。過載版本將操作作用在一對元素上,另外一個元素來自輸入的另外一個序列。結果輸出到指定容器。

<七>關係演算法(8個)

  • equal: 如果兩個序列在標誌範圍內元素都相等,返回true。過載版本使用輸入的操作符代替預設的等於操作符。
  • includes: 判斷第一個指定範圍內的所有元素是否都被第二個範圍包含,使用底層元素的<操作符,成功返回true。過載版本使用使用者輸入的函式。
  • lexicographical_compare: 比較兩個序列。過載版本使用使用者自定義比較操作。
  • max: 返回兩個元素中較大一個。過載版本使用自定義比較操作。
  • max_element: 返回一個ForwardIterator,指出序列中最大的元素。過載版本使用自定義比較操作。
  • min: 返回兩個元素中較小一個。過載版本使用自定義比較操作。
  • min_element: 返回一個ForwardIterator,指出序列中最小的元素。過載版本使用自定義比較操作。
  • mismatch: 並行比較兩個序列,指出第一個不匹配的位置,返回一對iterator,標誌第一個不匹配元素位置。如果都匹配,返回每個容器的last。過載版本使用自定義的比較操作。

<八>集合演算法(4個)

  • set_union: 構造一個有序序列,包含兩個序列中所有的不重複元素。過載版本使用自定義的比較操作。
  • set_intersection: 構造一個有序序列,其中元素在兩個序列中都存在。過載版本使用自定義的比較操作。
  • set_difference: 構造一個有序序列,該序列僅保留第一個序列中存在的而第二個中不存在的元素。過載版本使用自定義的比較操作。
  • set_symmetric_difference: 構造一個有序序列,該序列取兩個序列的對稱差集(並集-交集)。

<九>堆演算法(4個)

  • make_heap: 把指定範圍內的元素生成一個堆。過載版本使用自定義比較操作。
  • pop_heap: 並不真正把最大元素從堆中彈出,而是重新排序堆。它把first和last-1交換,然後重新生成一個堆。可使用容器的back來訪問被”彈出”的元素或者使用pop_back進行真正的刪除。過載版本使用自定義的比較操作。
  • push_heap: 假設first到last-1是一個有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。在指向該函式前,必須先把元素插入容器後。過載版本使用指定的比較操作。
  • sort_heap: 對指定範圍內的序列重新排序,它假設該序列是個有序堆。過載版本使用自定義比較操作。

共70個演算法。

參考資料