非更易型算法
這些算法不會改動元素值,也不會改變元素的次序。
-
計數: 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++標準庫》