Algorithm (C++)
Hlavičkový soubor <algorithm>
ze standardní knihovny C++ deklaruje různé funkce, které provádějí algoritmické operace na kontejnerech a posloupnostech reprezentovaných iterátory.[1][2] Několik málo algoritmů je také v hlavičkovém souboru <numeric>
. Všechny algoritmy jsou ve jmenném prostoru std
.
Politiky provádění
[editovat | editovat zdroj]Jazyk C++ umožňuje stanovit politiku provádění (též zásady provádění, anglicky execution policy), která umožňuje paralelní provádění algoritmů (pomocí vláken nebo instrukcí SIMD).
Existují čtyři různé politiky provádění s různou sémantikou určující, v jakém pořadí lze přistupovat k prvkům:
sequenced_policy
– provádění algoritmu musí probíhat ve stejném vlákně, jaké funkci volá, a přístup k prvkům musí být podle jejich pořadí; je to ekvivalentní volání funkce bez politiky prováděníparallel_policy
– provádění algoritmu může probíhat ve více vláknech, ale v rámci každého vlákna musí být přístup k prvkům prováděn postupně (tj. přístupy k prvkům se nesmí provádět současně)parallel_unsequenced_policy
– provádění algoritmu může probíhat ve více vláknech, a přístupy k prvkům nemusí být v rámci jednoho vlákna prováděné podle jejich pořadíunsequenced_policy
– provádění algoritmu musí probíhat v tom vlákně, které funkci volá, ale přístup k prvkům nemusí zachovávat jejich pořadí
Při používání politik, které mohou vést k provádění v různých vláknech, musí programátor zajistit, aby operace prováděné funkcemi byly vláknově bezpečné,
Rozsahy
[editovat | editovat zdroj]V C++20 byly přidány algoritmy, které místo dvojic iterátorů pracují s rozsahy. Tyto funkce umožňují použít dvojici iterátor-zarážka a jsou definovány ve jmenném prostoru ranges
. Tyto algoritmy nevyžadují, aby oba iterátory byly téhož typu a umožňují interoperabilitu s objekty deklarovanými v hlavičkovém souboru <ranges>
, aniž by bylo nutné iterátory ručně extrahovat.
Operace s posloupnostmi bez jejich změny
[editovat | editovat zdroj]Kontrola predikátů
[editovat | editovat zdroj]Zjišťují, zda je zadaný predikát pravdivý pro nějakou část objektů v rozsahu, případně vrací počet objektů, pro které je predikát pravdivý:
all_of
– zadaný predikát je pravdivý pro všechny prvky v rozsahuany_of
– zadaný predikát je pravdivý alespoň pro jeden prvek v rozsahunone_of
– zadaný predikát není pravdivý pro žádný prvek v rozsahucount
– vrátí, kolikrát je zadaný prvek obsažen v rozsahucount_if
– vrací počet prvků v rozsahu, pro které je zadaný predikát pravdivýcontains
– zjišťuje, zda je zadaný prvek obsažen v rozsahu
Algoritmy porovnání
[editovat | editovat zdroj]Porovná zda dva rozsahy mají určitou vlastnost:
mismatch
– najde první prvek, kterým se dva rozsahy lišíequal
– porovná, zda všechny prvky rozsahů jsou stejnélexicographical_compare
– vrátítrue
, pokud první rozsah je lexikograficky před druhýmcontains_subrange
– vrátí logickou hodnotu, zda druhý zadaný rozsah je obsažen v prvním zadaném rozsahustarts_with
ends_with
is_permutation
Vyhledávací algoritmy
[editovat | editovat zdroj]Najde v rozsahu první nebo poslední pozici, kde následující prvky vyhovují určitému predikátu
find
find_if
find_if_not
find_last
find_last_if
find_last_if_not
find_end
find_first_of
adjacent_find
search
search_n
partition_point
Binární vyhledávací algoritmy
[editovat | editovat zdroj]Poskytuje operace binárního vyhledávání pro rozsahy. Pro rozsahy, které nejsou setříděné, je výsledek nedefinovaný.
binary_search
upper_bound
lower_bound
equal_range
Algoritmy pro vyhledání minima/maxima
[editovat | editovat zdroj]Vyhledá v rozsahu nejmenší nebo největší prvek podle zadaného predikátu porovnání:
max_element
min_element
minmax_element
Algoritmy pro kontrolu vlastností
[editovat | editovat zdroj]Kontrolují, zda má celý rozsah určitou vlastnost:
is_partitioned
is_sorted
is_heap
Operace s posloupnostmi, které je mění
[editovat | editovat zdroj]Kopírování
[editovat | editovat zdroj]Přenáší prvky z jednoho rozsahu do jiného
copy
copy_if
copy_backward
move
move_backward
reverse_copy
rotate_copy
unique_copy
sample
Partitioning algoritmy
[editovat | editovat zdroj]Přemísťuje prvky v rozsahu na místě tak, aby rozsah byl členěn podle určité vlastnosti:
unique
remove
remove_if
partition
partition_copy
stable_partition
Třídicí algoritmy
[editovat | editovat zdroj]Setřídí nebo částečně setřídí rozsah na místě:
sort
partial sort
stable_sort
nth_element
Vytváření rozsahů
[editovat | editovat zdroj]Vytvoří daný rozsah bez čtení hodnot v něm obsažených:
fill
generate
iota
Transformační algoritmy
[editovat | editovat zdroj]Transformuje každý prvek daného rozsahu na místě:
for_each
transform
replace
replace_if
clamp
Algoritmy pro přerovnání
[editovat | editovat zdroj]Mění pořadí prvků v rozsahu na místě:
shuffle
shift_left
shift_right
reverse
rotate
Heap algoritmy
[editovat | editovat zdroj]Poskytuje algoritmy pro práci s binární haldou – její vytvoření, vkládání prvků, a odstraňování prvků:
Odkazy
[editovat | editovat zdroj]Reference
[editovat | editovat zdroj]V tomto článku byl použit překlad textu z článku Algorithm (C++) na anglické Wikipedii.
- ↑ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programovací Jazyky - C++ §25 Algorithms library [lib.algorithms] para. 1
- ↑ STROUSTRUP, Bjarne, 2009. Programming : principles and practice using C++. Upper Saddle River, NJ: Addison-Wesley. Dostupné online. ISBN 9780321543721. S. 729. Algoritmy ve standardní knihovna jsou deklarovány v hlavičkovém souboru
<algorithm>
..