<algorithm>
定義可執行演算法的 C++ 標準程式庫容器範本函式。
Syntax
(see links below for specific algorithm syntax)
注意
連結 <algorithm>
庫也會使用 #include <initializer_list>
語句。
備註
C++標準連結庫演算法可以在各種數據結構上運作。 他們可以操作的數據結構不僅包括 和 之類的vector
list
標準連結庫容器類別C++,而且包含使用者定義的數據結構和元素陣列,只要它們滿足特定演算法的需求。 C++ 標準程式庫演算法間接透過迭代器存取和周遊容器的元素,來達成這個一般性層級。
C++ 標準程式庫演算法會處理通常透過開始或結束位置指定的迭代器範圍。 所參考的範圍必須有效,也就是說,範圍中的所有反覆運算器都必須可取值,而且在每個範圍的序列中,必須藉由遞增反覆運算器從第一個位置觸達最後一個位置。
從 C++20 開始,在 中 <algorithm>
定義的大部分演算法也會以採用 range
的形式提供。 例如,您可以呼叫 ,而不是呼叫 sort(v1.begin(), v1.end(), greater<int>());
。 ranges::sort(v1, greater<int>());
C++標準連結庫演算法可以同時使用不同類型的容器物件。 已使用兩個後綴來傳達演算法用途的相關信息:
後
_if
綴表示演算法會與函式物件搭配使用,這些物件會針對元素的值運作,而不是在元素本身上運作。 例如,演算法會find_if
尋找符合函式物件所指定準則的專案,而演算法則會find
搜尋特定值。_copy
後綴表示演算法通常會修改複製的值,而不是複製修改的值。 換句話說,它們不會修改來源範圍的元素,而是將結果放入輸出範圍/反覆運算器中。 例如,演算法reverse
會反轉某個範圍內元素的順序,而reverse_copy
演算法會將反向結果複製到目的範圍。
C++標準連結庫演算法通常會分類為群組,以指出其用途或需求。 這些包括修改演算法,與不修改的演算法相比,變更元素的值。 變動演算法變更項目的順序,但不變更項目的值。 移除演算法可以從範圍或範圍的複本排除項目。 排序演算法會以各種方式重新排序某個範圍中的元素,而排序範圍演算法只會處理以特定方式排序元素的範圍。
提供給數值處理的標準連結庫數值演算法C++有自己的頭檔 <numeric>
,而且函式物件和配接器定義於標頭 <functional>
中。 傳回布爾值的函式對象稱為述詞。 預設二元述詞是比較 operator<
。 一般而言,要排序的元素必須小於可比性,如此一來,假設任何兩個元素,都可以判斷它們相等(從意義上說兩者都不小於另一個元素),或一個小於另一個元素。 這會導致在非對等元件中的排序。
演算法
名稱 | 描述 |
---|---|
adjacent_find |
搜尋等於或符合指定之條件的兩個相鄰項目。 |
all_of |
當條件出現在指定的範圍中的每個項目時,傳回 true 。 |
any_of |
當條件出現在指定的項目範圍至少一次時,傳回 true 。 |
binary_search |
測試已排序的範圍中是否有等於指定之值 (或在二元述詞指定的意義上,相當於該值) 的項目。 |
clamp |
|
copy |
從來源範圍將項目的值指定到目的範圍,逐一查看項目的來源序列,並以正向方向指派它們新位置。 |
copy_backward |
從來源範圍將項目的值指定到目的範圍,逐一查看項目的來源序列,並以反向方向指派它們新位置。 |
copy_if |
複製特定範圍中針對指定的條件測試為 true 的所有項目 |
copy_n |
複製指定的項目數目。 |
count |
傳回範圍中值符合指定值的項目數目。 |
count_if |
傳回範圍中值符合指定條件的項目數目。 |
equal |
逐一比較兩個範圍的每個項目是否相等 (或在二元述詞指定的意義上,是否對等)。 |
equal_range |
在已排序的範圍中尋找一對位置,第一個位置小於或等於指定項目的位置,第二個位置大於該項目的位置,其中用於建立序列中位置的等價或順序意義可由二元述詞指定。 |
fill |
將相同的新值指派到指定範圍內的每個項目。 |
fill_n |
指派新值給範圍中以特定項目開頭的指定項目數。 |
find |
在範圍中找出有指定值的第一個項目的位置。 |
find_end |
在範圍中尋找與指定序列相同 (或在二元述詞指定的意義上,相當於該序列) 的最後一個子序列。 |
find_first_of |
在目標範圍內搜尋第一次出現的任何多個值,或第一次出現的任何多個項目 (在二元述詞指定的意義上,相當於指定之項目集合)。 |
find_if |
在範圍中找出滿足特定條件的第一個項目的位置。 |
find_if_not |
傳回指定範圍中不符合條件的第一個專案。 |
for_each |
將指定的函式物件以正向順序套用至範圍內的每個項目,並傳回函式物件。 |
for_each_n |
|
generate |
將函式物件產生的值指派給範圍內的每個項目。 |
generate_n |
將函式物件產生的值指派給範圍內的指定項目數,並返回到超過最後一個指定值的位置。 |
includes |
測試一個排序範圍是否包含第二個排序範圍內的所有項目,其中項目之間的順序或等價準則可由二元述詞指定。 |
inplace_merge |
將兩個連續排序範圍內的項目結合成單一排序範圍,其中順序準則可由二元述詞指定。 |
is_heap |
如果在指定範圍內的項目形成堆積,則傳回 true 。 |
is_heap_until |
如果指定的範圍形成堆積直到最後項目,則傳回 true 。 |
is_partitioned |
如果在指定範圍內針對條件測試為 true 的所有項目都是在測試為 true 的任何項目之前,傳回 false 。 |
is_permutation |
判斷指定的範圍中的元素是否構成有效的排列。 |
is_sorted |
如果在指定範圍內的項目為已排序順序,則傳回 true 。 |
is_sorted_until |
如果在指定範圍內的項目為已排序順序,則傳回 true 。 |
iter_swap |
交換由一組指定之迭代器所參考的兩個值。 |
lexicographical_compare |
逐一比較兩個序列之間的每個項目,判斷兩者較小者。 |
lower_bound |
在已排序範圍中尋找值大於或相當於指定值的第一個項目的位置,其中順序準則可由二元述詞指定。 |
make_heap |
將在指定範圍內的項目轉換為堆積,其中第一個項目是最大,而且排序準則可由二元述詞指定。 |
max |
比較兩個物件並傳回兩者較大者,其中順序準則可由二元述詞指定。 |
max_element |
在指定的範圍內尋找第一個最大項目,其中順序準則可由二元述詞指定。 |
merge |
將兩個排序來源範圍內的所有項目結合成單一排序目的範圍,其中順序準則可由二元述詞指定。 |
min |
比較兩個物件並傳回兩者較小者,其中順序準則可由二元述詞指定。 |
min_element |
在指定的範圍內尋找第一個最小項目,其中順序準則可由二元述詞指定。 |
minmax |
比較兩個輸入參數並做為一組傳回,從最小排到最大。 |
minmax_element |
在一個呼叫中執行 min_element 和 max_element 所執行的工作。 |
mismatch |
逐一比較兩個範圍的每個項目是否相等 (或在二元述詞指定的意義上,是否對等),而且找出差異發生的第一個位置。 |
<alg> move |
移動與所指定範圍相關聯的項目。 |
move_backward |
將一個迭代器的項目移至另一個迭代器。 從指定範圍內的最後一個項目開始移動,並以該範圍內的第一個項目結束。 |
next_permutation |
重新排列範圍的項目,讓原始順序由語彙方面下一個較大的排列取代 (如果有的話),其中下一個的意義可由二元述詞指定。 |
none_of |
當條件從未出現在指定的範圍中的項目時,傳回 true 。 |
nth_element |
分割某範圍的元素,將序列的第 n 個元素正確放入範圍中,以便在它前面的所有元素小於或等於它,而且序列中在它後面的所有元素大於或等於它。 |
partial_sort |
將範圍中指定的較小項目數目排列成非遞減排列,或是依據二元述詞指定的順序準則。 |
partial_sort_copy |
從來源範圍將項目複製到目的範圍,其中來源項目是依小於排序,或依據二元述詞指定的順序準則。 |
partition |
將範圍中的項目分類為兩個斷續集合,而滿足一元述詞的項目在無法滿足一元述詞的項目之前。 |
partition_copy |
將條件是 true 的項目複製到一個目的地,並將條件是 false 的項目複製到另一個目的地。 項目必須來自指定的範圍。 |
partition_point |
傳回指定範圍中不符合條件的第一個專案。 元素會進行排序,讓滿足條件的元素在不符合條件之前。 |
pop_heap |
從堆積的前面移動最大的項目至範圍的倒數第二個位置,然後從其餘項目形成新的堆積。 |
prev_permutation |
重新排列範圍的項目,讓原始順序由語彙方面下一個較大的排列取代 (如果有的話),其中下一個的意義可由二元述詞指定。 |
push_heap |
將在範圍結尾的項目加入至由範圍中之前項目所組成的現有堆積。 |
random_shuffle |
將範圍中 N 個元素的序列重新整理為 N! 排列方式隨機選取的其中一個。 |
remove |
從指定範圍中排除指定的值,而不會干擾其餘項目的順序,並傳回沒有指定值、新範圍的結尾。 |
remove_copy |
將專案從來源範圍複製到目的範圍,但未複製指定值的專案,而不會干擾其餘專案的順序,並傳回新目的地範圍的結尾。 |
remove_copy_if |
將專案從來源範圍複製到目的範圍,但無法複製滿足述詞,而不會干擾其餘元素的順序,並傳回新目的地範圍的結尾。 |
remove_if |
從指定範圍中排除滿足述詞的項目,而不會干擾其餘項目的順序,並傳回沒有指定值、新範圍的結尾。 |
replace |
檢查範圍內的每個項目,如果符合指定的值則予以取代。 |
replace_copy |
檢查來源範圍內的每個項目,如果符合指定的值則予以取代,同時將結果複製到新目的範圍。 |
replace_copy_if |
檢查來源範圍內的每個項目,如果滿足指定的述詞則予以取代,同時將結果複製到新目的範圍。 |
replace_if |
檢查範圍內的每個項目,如果滿足指定的述詞則予以取代。 |
reverse |
反轉範圍內項目的順序。 |
reverse_copy |
反轉來源範圍內項目的順序,並將其複製到目的範圍 |
rotate |
交換兩個相鄰範圍的項目。 |
rotate_copy |
交換來源範圍內兩個相鄰範圍的項目,並將結果複製到目的範圍。 |
sample |
|
search |
在目標範圍中搜尋第一個序列,其項目等於指定項目序列中的項目,或在二元述詞指定的意義上,其項目相當於指定序列中的項目。 |
search_n |
在範圍中搜尋包含指定項目數的第一個子序列,這些項目具有特定值或在二元述詞指定的意義上與該值關聯。 |
set_difference |
將屬於一個排序來源範圍但不屬於第二個排序來源範圍的所有項目聯集為單一排序的目的範圍,其中順序準則可由二元述詞指定。 |
set_intersection |
將屬於兩個排序來源範圍的所有項目聯集為單一排序目的範圍,其中順序準則可由二元述詞指定。 |
set_symmetric_difference |
將屬於兩個排序來源範圍之一 (但非兩者) 的所有項目聯集為單一排序目的範圍,其中順序準則可由二元述詞指定。 |
set_union |
將至少屬於兩個排序來源範圍之一的所有項目聯集為單一排序目的範圍,其中順序準則可由二元述詞指定。 |
sort |
將在指定範圍中的項目排列成非遞減排列,或是依據二元述詞指定的順序準則。 |
shuffle |
使用亂數產生器隨機播放 (重新整理) 指定範圍的項目。 |
sort_heap |
將堆積轉換為排序的範圍。 |
stable_partition |
將範圍中的項目分類為兩個斷續集合,而滿足一元述詞的項目在無法滿足一元述詞的項目之前,保留對等項目的相對順序。 |
stable_sort |
將在指定範圍中的項目排列成非遞減排列,或是依據二元述詞指定的順序準則,並保留對等項目的相對順序。 |
swap |
在兩種類型的物件之間交換項目的值,將第一個物件的內容指派給第二個物件,並將第一個物件的內容指派給第一個物件。 |
swap_ranges |
將某個範圍的項目與另一個相等大小之範圍的項目交換。 |
transform |
將指定的函式物件應用至來源範圍中的每個項目,或是一組來自兩個來源範圍的項目,並複製函式物件的傳回值到目的範圍。 |
unique |
拿掉指定範圍中彼此相鄰的重複專案。 |
unique_copy |
從來源範圍將專案複製到目的範圍,但彼此相鄰的重複專案除外。 |
upper_bound |
在已排序範圍中尋找值大於指定值的第一個項目的位置,其中順序準則可由二元述詞指定。 |