STL算法概覽

非更易型算法


這些算法不會改動元素值,也不會改變元素的次序。

  • 計數: count/count_if

    • 線性複雜度
  • 最大值最小值:max_element/min_element/minmax_element

    • 線性複雜度
  • 查找元素

    • 查找第一個匹配元素:find/find_if/find_if_not
    • 查找前n個連續匹配值:search_n
    • 查找第一個子區間:search
    • 查找最後一個子區間:find_end
    • 查找某元素第一次出現的地點:find_first_of
    • 查找兩個連續且相等的元素:adjacent_find
    • 以上均線性複雜度
  • 區間比較

    • 檢驗相等:equal
    • 測試不定序之相等性:is_permutation(不關心順序)
    • 查找第一處不同:mismatch
    • 小於:lexicographical_compare
    • 線性複雜度
  • 檢驗區間

    • 是否有序:is_sorted/is_sorted_until
    • 是否被分割:is_partitioned/partition_point
    • 是否是heap: is_heap/is_heap_until
    • all/any/none: all_of/any_of/none_of
    • 線性複雜度

更易型算法


這些算法會改變/變動區間內的元素內容。

注意,目標區間不能是associative/unordered類型容器,因爲它們的元素爲常量,不允許任意改動。

  • 複製元素

    • copy/copy_if/copy_n/copy_backward
    • 線性複雜度
  • 搬移元素

    • move/move_backward
    • 線性複雜度
  • 轉換結合元素

    • transform
    • 線性複雜度
  • 互換元素

    • swap_ranges
    • 線性複雜度
  • 賦值

    • 賦予相同的值:fill/fill_n
    • 賦予新生值:generate/generate_n
    • 賦予一系列遞增值:iota
    • 線性複雜度
  • 替換元素

    • 替換序列內元素:replace/replace_if
    • 複製並替換元素:replace_copy/replace_copy_if
    • 線性複雜度

移除型算法


根據某一準則,在一個區間內移除某些元素。

注意,這些算法不會改變元素的數量,它們只是以邏輯上,將原本置於後面的元素向前移動,覆蓋那些應該被移除的元素,返回新區間的邏輯終點。

  • 移除某些元素

    • 移除序列內某些元素: remove/remove_if
    • 複製時一併移除元素:remove_copy/remove_copy_if
    • 線性複雜度
  • 移除重複元素

    • 移除連續重複元素: unique
    • 複製過程中移除重複元素:unique_copy
    • 線性複雜度

變序型算法


這些算法會改變元素的次序,但不改變元素的值。

注意:這些算法不能用於associative和unordered容器。

  • 反轉元素次序

    • reverse/reverse_copy
    • 線性複雜度
  • 旋轉元素

    • 旋轉序列內元素:rotate
    • 複製並旋轉元素:rotate_copy
    • 線性複雜度
  • 排列元素

    • next_permutation/prev_permutation
    • 線性複雜度
  • 對元素重新洗牌

    • 以隨機數重新洗牌:shuffle/random_shuffle
    • 線性複雜度
  • 將元素向前搬

    • partition/stable_partition
    • 線性複雜度
  • 劃分爲兩個子區間

    • partition_copy
    • 線性複雜度

排序算法


STL支持完全排序和局部排序,如果局部排序滿足需求,則應優先使用它,因爲它的效率較高。

associative容器會自動排序,但對全體元素進行一次性排序,通常比“始終讓它們保持排序狀態”更高效。

  • 對所有元素排序

    • sort/stable_sort
    • 複雜度:nlogn
  • 局部排序

    • partial_sort/partial_sort_copy
    • 複雜度:nlogn——線性之間
  • 根據第n個元素排序

    • nth_element
    • 線性複雜度
  • Heap算法

    • make_heap/push_heap/pop_heap/sort_heap
    • Heap是實現priority queue的一個理想結構,heap算法被priority_queue容器使用

已排序區間算法


適用於區間已經有序,它通常會具有明顯的效能優勢。

如果這些算法作用於未排序的區間,將導致不明確的行爲。

  • 查找元素

    • 檢查某元素是否存在:binary_search
    • 檢查數個元素是否存在:includes
    • 查找第一個或最後一個可能位置:lower_bound/upper_bound
    • 查找區間位置:equal_range
    • 複雜度各不相同
  • 合併元素

    • 兩個已排序集合的總和:merge
    • 兩個已排序集合的並集:set_union
    • 兩個已排序集合的交集:set_intersection
    • 兩個已排序集合的差集:set_difference
    • 兩個已排序集合的互差:set_symmetric_difference
    • 合併連貫之已排序區間:inplace_merge

數值算法


用於數值運算,需要包含頭文件:。

  • 運算後產生結果

    • 對數列運算:accumulate
    • 計算兩數列內積:inner_product
    • 線性複雜度
  • 相對數列和絕對數列之間的轉換

    • 相對值轉換爲絕對值:partial_sum
    • 絕對值轉換爲相對值:adjacent_difference
    • 線性複雜度

小結


STL提供了豐富的算法,以便於對標準容器進行一系列操作。

本文只是簡單羅列出了算法的類型和名稱,關於算法的具體使用和示例,可以方便地找到相關資料。

關於更深層次的內容,如,算法背後的數據結構、效率、複雜度等,可以繼續探索。

參考資料

《STL C++標準庫》

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