Algorithms library - cppreference.com

The algorithms library defines functions for a variety of purposes (e.g. searching, sorting, counting, manipulating) that operate on

ranges

of elements.

Constrained algorithms

(since C++20)

C++20 provides

constrained

versions of most algorithms in the namespace std::ranges. In these algorithms, a range can be specified as either an

iterator

-

sentinel

pair or as a single

range

argument, and projections and pointer-to-member callables are supported. Additionally, the

return types

of most algorithms have been changed to return all potentially useful information computed during the execution of the algorithm.

std::vector<int>v{7,1,4,0,-1};std::ranges::sort(v);// constrained algorithmParallel algorithms (since C++17)

A parallel algorithm is a function template in the algorithms library with a template parameter named ExecutionPolicy or constrained by

execution-policy

(since C++26). Such a template parameter is termed an execution policy template parameter , it describes the manner in which the execution of a parallel algorithm may be parallelized.

Unless otherwise stated, parallel algorithms are allowed to make arbitrary copies of elements from ranges, as long as both std::is_trivially_copy_constructible_v<T> and std::is_trivially_destructible_v<T> are true, where T is the type of elements.

Execution policies

The standard library algorithms support several

execution policies

, and the library provides corresponding execution policy types and objects. Users may select an execution policy statically by invoking a parallel algorithm with an

execution policy object

of the corresponding type.

Standard library implementations (but not the users) may define additional execution policies as an extension. The semantics of parallel algorithms invoked with an execution policy object of implementation-defined type is implementation-defined.

Defined in header

<execution>

Defined in namespace std::execution

sequenced_policyparallel_policyparallel_unsequenced_policyunsequenced_policy

(C++17)(C++17)(C++17)(C++20)

execution policy types
(class)

[edit]

seqparpar_unsequnseq

(C++17)(C++17)(C++17)(C++20)

global execution policy objects
(constant)

[edit]

Defined in namespace std

is_execution_policy

(C++17)

test whether a class represents an execution policy
(class template)

[edit]

execution-policy

(C++26)

specifies that a type represents an execution policy
(exposition-only concept*)

[edit]

Non-modifying sequence operations

Batch operations

Search operations

Defined in header

<algorithm>

all_ofany_ofnone_of

(C++11)(C++11)(C++11)

checks if a predicate is true for all, any or none of the elements in a range
(function template & algorithm function object)

[edit]

ranges::all_ofranges::any_ofranges::none_of

(C++20)(C++20)(C++20)

ranges::containsranges::contains_subrange

(C++23)(C++23)

checks if the range contains the given element or subrange
(algorithm function object)

[edit]

findfind_iffind_if_not

(C++11)

finds the first element satisfying specific criteria
(function template & algorithm function object)

[edit]

ranges::findranges::find_ifranges::find_if_not

(C++20)(C++20)(C++20)

ranges::find_lastranges::find_last_ifranges::find_last_if_not

(C++23)(C++23)(C++23)

finds the last element satisfying specific criteria
(algorithm function object)

[edit]

find_end

finds the last sequence of elements in a certain range
(function template & algorithm function object)

[edit]

ranges::find_end

(C++20)

find_first_of

searches for any one of a set of elements
(function template & algorithm function object)

[edit]

ranges::find_first_of

(C++20)

adjacent_find

finds the first two adjacent items that are equal (or satisfy a given predicate)
(function template & algorithm function object)

[edit]

ranges::adjacent_find

(C++20)

countcount_if

returns the number of elements satisfying specific criteria
(function template & algorithm function object)

[edit]

ranges::countranges::count_if

(C++20)(C++20)

mismatch

finds the first position where two ranges differ
(function template & algorithm function object)

[edit]

ranges::mismatch

(C++20)

equal

determines if two sets of elements are the same
(function template & algorithm function object)

[edit]

ranges::equal

(C++20)

search

searches for the first occurrence of a range of elements
(function template & algorithm function object)

[edit]

ranges::search

(C++20)

search_n

searches for the first occurrence of a number consecutive copies of an element in a range
(function template & algorithm function object)

[edit]

ranges::search_n

(C++20)

ranges::starts_with

(C++23)

checks whether a range starts with another range
(algorithm function object)

[edit]

ranges::ends_with

(C++23)

checks whether a range ends with another range
(algorithm function object)

[edit]

Fold operations (since C++23)

Defined in header

<algorithm>

indirectly-binary-left-foldableindirectly-binary-right-foldable

(C++23)(C++23)

specifies that a callable type can be used in fold algorithms
(exposition-only concept*)

[edit]

ranges::fold_left

(C++23)

left-folds a range of elements
(algorithm function object)

[edit]

ranges::fold_left_first

(C++23)

left-folds a range of elements using the first element as an initial value
(algorithm function object)

[edit]

ranges::fold_right

(C++23)

right-folds a range of elements
(algorithm function object)

[edit]

ranges::fold_right_last

(C++23)

right-folds a range of elements using the last element as an initial value
(algorithm function object)

[edit]

ranges::fold_left_with_iter

(C++23)

left-folds a range of elements, and returns a

pair

(iterator, value)
(algorithm function object)

[edit]

ranges::fold_left_first_with_iter

(C++23)

left-folds a range of elements using the first element as an initial value, and returns a

pair

(iterator,

optional

)
(algorithm function object)

[edit]

Modifying sequence operations

Copy operations

Defined in header

<algorithm>

copycopy_if

(C++11)

copies a range of elements to a new location
(function template & algorithm function object)

[edit]

ranges::copyranges::copy_if

(C++20)(C++20)

copy_n

(C++11)

copies a number of elements to a new location
(function template & algorithm function object)

[edit]

ranges::copy_n

(C++20)

copy_backward

copies a range of elements in backwards order
(function template & algorithm function object)

[edit]

ranges::copy_backward

(C++20)

move

(C++11)

moves a range of elements to a new location
(function template & algorithm function object)

[edit]

ranges::move

(C++20)

move_backward

(C++11)

moves a range of elements to a new location in backwards order
(function template & algorithm function object)

[edit]

ranges::move_backward

(C++20)

Swap operations

Defined in header

<algorithm>

(until C++11)

Defined in header

<utility>

(since C++11)

Defined in header

<string_view>

swap

swaps the values of two objects
(function template)

[edit]

Defined in header

<algorithm>

swap_ranges

swaps two ranges of elements
(function template & algorithm function object)

[edit]

ranges::swap_ranges

(C++20)

iter_swap

swaps the elements pointed to by two iterators
(function template)

[edit]

Transformation operations

Defined in header

<algorithm>

transform

applies a function to a range of elements, storing results in a destination range
(function template & algorithm function object)

[edit]

ranges::transform

(C++20)

replacereplace_if

replaces all values satisfying specific criteria with another value
(function template & algorithm function object)

[edit]

ranges::replaceranges::replace_if

(C++20)(C++20)

replace_copyreplace_copy_if

copies a range, replacing elements satisfying specific criteria with another value
(function template & algorithm function object)

[edit]

ranges::replace_copyranges::replace_copy_if

(C++20)(C++20)

Generation operations

Defined in header

<algorithm>

fill

copy-assigns the given value to every element in a range
(function template & algorithm function object)

[edit]

ranges::fill

(C++20)

fill_n

copy-assigns the given value to N elements in a range
(function template & algorithm function object)

[edit]

ranges::fill_n

(C++20)

generate

assigns the results of successive function calls to every element in a range
(function template & algorithm function object)

[edit]

ranges::generate

(C++20)

generate_n

assigns the results of successive function calls to N elements in a range
(function template & algorithm function object)

[edit]

ranges::generate_n

(C++20)

Removing operations

Defined in header

<algorithm>

removeremove_if

removes elements satisfying specific criteria
(function template & algorithm function object)

[edit]

ranges::removeranges::remove_if

(C++20)(C++20)

remove_copyremove_copy_if

copies a range of elements omitting those that satisfy specific criteria
(function template & algorithm function object)

[edit]

ranges::remove_copyranges::remove_copy_if

(C++20)(C++20)

unique

removes consecutive duplicate elements in a range
(function template & algorithm function object)

[edit]

ranges::unique

(C++20)

unique_copy

creates a copy of some range of elements that contains no consecutive duplicates
(function template & algorithm function object)

[edit]

ranges::unique_copy

(C++20)

Order-changing operations

Defined in header

<algorithm>

reverse

reverses the order of elements in a range
(function template & algorithm function object)

[edit]

ranges::reverse

(C++20)

reverse_copy

creates a copy of a range that is reversed
(function template & algorithm function object)

[edit]

ranges::reverse_copy

(C++20)

rotate

rotates the order of elements in a range
(function template & algorithm function object)

[edit]

ranges::rotate

(C++20)

rotate_copy

copies and rotate a range of elements
(function template & algorithm function object)

[edit]

ranges::rotate_copy

(C++20)

shift_leftshift_right

(C++20)(C++20)

shifts elements in a range
(function template & algorithm function object)

[edit]

ranges::shift_leftranges::shift_right

(C++23)(C++23)

random_shuffleshuffle

(until C++17)(C++11)

randomly re-orders elements in a range
(function template & algorithm function object)

[edit]

ranges::shuffle

(C++20)

Sampling operations

Sorting and related operations

Requirements

Some algorithms require the sequence represented by the arguments to be “sorted” or “partitioned”. The behavior is undefined if the requirement is not met.

A sequence is sorted with respect to a comparator comp if for every iterator iter pointing to the sequence and every non-negative integer n such that iter+n

[1]

is a

valid iterator

pointing to an element of the sequence, comp(*(iter+n),*iter)==false

[1]

.

(until C++20)A sequence is sorted with respect to comp and proj for a comparator comp and projection proj if for every iterator iter pointing to the sequence and every non-negative integer n such that iter+n

[1]

is a valid iterator pointing to an element of the sequence, bool(std::invoke(comp,std::invoke(proj,*(iter+n)),
std::invoke(proj,*iter)))

[1]

is false.

A sequence is sorted with respect to a comparator comp if the sequence is sorted with respect to comp and std::identity{} (the identity projection).

(since C++20)A sequence [start, finish) is partitioned with respect to an expression f(e) if there exists an integer n such that for all i in [0, std::distance(start,finish)), f(*(start+i))

[1]

is true if and only if i<n.

1.0

1.1

1.2

1.3

1.4

iter+n simply means “the result of iter being incremented n times”, regardless of whether iter is a random access iterator.

Partitioning operations

Defined in header

<algorithm>

is_partitioned

(C++11)

determines if the range is partitioned by the given predicate
(function template & algorithm function object)

[edit]

ranges::is_partitioned

(C++20)

partition

divides a range of elements into two groups
(function template & algorithm function object)

[edit]

ranges::partition

(C++20)

partition_copy

(C++11)

copies a range dividing the elements into two groups
(function template & algorithm function object)

[edit]

ranges::partition_copy

(C++20)

stable_partition

divides elements into two groups while preserving their relative order within each group
(function template & algorithm function object)

[edit]

ranges::stable_partition

(C++20)

partition_point

(C++11)

locates the partition point of a partitioned range
(function template & algorithm function object)

[edit]

ranges::partition_point

(C++20)

Sorting operations

Defined in header

<algorithm>

sort

sorts a range of elements
(function template & algorithm function object)

[edit]

ranges::sort

(C++20)

stable_sort

sorts a range of elements while preserving relative order between equivalent elements
(function template & algorithm function object)

[edit]

ranges::stable_sort

(C++20)

partial_sort

sorts the first N elements of a range
(function template & algorithm function object)

[edit]

ranges::partial_sort

(C++20)

partial_sort_copy

copies and partially sorts a range of elements
(function template & algorithm function object)

[edit]

ranges::partial_sort_copy

(C++20)

is_sorted

(C++11)

checks whether a range is sorted
(function template & algorithm function object)

[edit]

ranges::is_sorted

(C++20)

is_sorted_until

(C++11)

finds the largest sorted subrange
(function template & algorithm function object)

[edit]

ranges::is_sorted_until

(C++20)

nth_element

finds the Nth element if the range were sorted
(function template & algorithm function object)

[edit]

ranges::nth_element

(C++20)

Binary search operations (on partitioned ranges)

Defined in header

<algorithm>

lower_bound

finds the first element not less than the given value using binary search
(function template & algorithm function object)

[edit]

ranges::lower_bound

(C++20)

upper_bound

finds the first element greater than the given value using binary search
(function template & algorithm function object)

[edit]

ranges::upper_bound

(C++20)

equal_range

finds the range of elements matching the given value using binary search
(function template & algorithm function object)

[edit]

ranges::equal_range

(C++20)

binary_search

determines if an element exists in a range using binary search
(function template & algorithm function object)

[edit]

ranges::binary_search

(C++20)

Set operations (on sorted ranges)

Defined in header

<algorithm>

includes

determines if one sequence is a subsequence of another
(function template & algorithm function object)

[edit]

ranges::includes

(C++20)

set_union

computes the union of two sets
(function template & algorithm function object)

[edit]

ranges::set_union

(C++20)

set_intersection

computes the intersection of two sets
(function template & algorithm function object)

[edit]

ranges::set_intersection

(C++20)

set_difference

computes the difference between two sets
(function template & algorithm function object)

[edit]

ranges::set_difference

(C++20)

set_symmetric_difference

computes the symmetric difference between two sets
(function template & algorithm function object)

[edit]

ranges::set_symmetric_difference

(C++20)

Merge operations (on sorted ranges)

Heap operations

A random access

range

[first, last) is a heap with respect to a comparator comp if bool(comp(first[(i-1)/2],first[i])) is false for all integer i in (0, last-first).

(until C++20)A random access

range

[first, last) is a heap with respect to comp and proj for a comparator comp and projection proj if bool(std::invoke(comp,std::invoke(proj,first[(i-1)/2]),
std::invoke(proj,first[i])) is false for all integer i in (0, last-first).

A random access range [first, last) is a heap with respect to a comparator comp if the range is a heap with respect to comp and std::identity{} (the identity projection).

(since C++20)A heap can be created by

std::make_heap

and

ranges::make_heap

(since C++20).

For more properties of heap, see

max heap

.

Defined in header

<algorithm>

push_heap

adds an element to a max heap
(function template & algorithm function object)

[edit]

ranges::push_heap

(C++20)

pop_heap

removes the largest element from a max heap
(function template & algorithm function object)

[edit]

ranges::pop_heap

(C++20)

make_heap

creates a max heap out of a range of elements
(function template & algorithm function object)

[edit]

ranges::make_heap

(C++20)

sort_heap

turns a max heap into a range of elements sorted in ascending order
(function template & algorithm function object)

[edit]

ranges::sort_heap

(C++20)

is_heap

(C++11)

checks if the given range is a max heap
(function template & algorithm function object)

[edit]

ranges::is_heap

(C++20)

is_heap_until

(C++11)

finds the largest subrange that is a max heap
(function template & algorithm function object)

[edit]

ranges::is_heap_until

(C++20)

Minimum/maximum operations

Defined in header

<algorithm>

max

returns the greater of the given values
(function template & algorithm function object)

[edit]

ranges::max

(C++20)

max_element

returns the largest element in a range
(function template & algorithm function object)

[edit]

ranges::max_element

(C++20)

min

returns the smaller of the given values
(function template & algorithm function object)

[edit]

ranges::min

(C++20)

min_element

returns the smallest element in a range
(function template & algorithm function object)

[edit]

ranges::min_element

(C++20)

minmax

(C++11)

returns the smaller and larger of two elements
(function template & algorithm function object)

[edit]

ranges::minmax

(C++20)

minmax_element

(C++11)

returns the smallest and the largest elements in a range
(function template & algorithm function object)

[edit]

ranges::minmax_element

(C++20)

clamp

(C++17)

clamps a value between a pair of boundary values
(function template & algorithm function object)

[edit]

ranges::clamp

(C++20)

Lexicographical comparison operations

Permutation operations

Defined in header

<algorithm>

next_permutation

generates the next greater lexicographic permutation of a range of elements
(function template & algorithm function object)

[edit]

ranges::next_permutation

(C++20)

prev_permutation

generates the next smaller lexicographic permutation of a range of elements
(function template & algorithm function object)

[edit]

ranges::prev_permutation

(C++20)

is_permutation

(C++11)

determines if a sequence is a permutation of another sequence
(function template & algorithm function object)

[edit]

ranges::is_permutation

(C++20)

Numeric operations

Defined in header

<numeric>

iota

(C++11)

fills a range with successive increments of the starting value
(function template & algorithm function object)

[edit]

ranges::iota

(C++23)

accumulate

sums up or folds a range of elements
(function template)

[edit]

inner_product

computes the inner product of two ranges of elements
(function template)

[edit]

adjacent_difference

computes the differences between adjacent elements in a range
(function template)

[edit]

partial_sum

computes the partial sum of a range of elements
(function template)

[edit]

reduce

(C++17)

similar to

std::accumulate

, except out of order
(function template)

[edit]

exclusive_scan

(C++17)

similar to

std::partial_sum

, excludes the ith input element from the ith sum
(function template)

[edit]

inclusive_scan

(C++17)

similar to

std::partial_sum

, includes the ith input element in the ith sum
(function template)

[edit]

transform_reduce

(C++17)

applies an invocable, then reduces out of order
(function template)

[edit]

transform_exclusive_scan

(C++17)

applies an invocable, then calculates exclusive scan
(function template)

[edit]

transform_inclusive_scan

(C++17)

applies an invocable, then calculates inclusive scan
(function template)

[edit]

Specialized <memory> algorithms

Specialized <random> algorithms (since C++26)

Notes

Feature-test

macro ValueStdFeature

__cpp_lib_algorithm_default_value_type

202403L

(C++26)

List-initialization

for algorithms

__cpp_lib_algorithm_iterator_requirements

202207L

(C++23)Ranges iterators as inputs to non-Ranges algorithms

__cpp_lib_clamp

201603L

(C++17)

std::clamp

__cpp_lib_constexpr_algorithms

201806L

(C++20)Constexpr for algorithms

202306L

(C++26)Constexpr stable sorting

__cpp_lib_execution

201603L

(C++17)Execution policies

201902L

(C++20)

std::execution::unsequenced_policy

__cpp_lib_freestanding_algorithm

202311L

(C++26)Freestanding facilities in

<algorithm>

__cpp_lib_parallel_algorithm

201603L

(C++17)Parallel algorithms

202506L

(C++26)Parallel range algorithms

__cpp_lib_robust_nonmodifying_seq_ops

201304L

(C++14)Making non-modifying sequence operations more robust (two-range overloads for

std::mismatch

,

std::equal

and std::is_permutation)

__cpp_lib_sample

201603L

(C++17)

std::sample

__cpp_lib_shift

201806L

(C++20)std::shift_left and std::shift_rightC library

sorts a range of elements with unspecified type
(function)

[edit]

searches an array for an element of unspecified type
(function)

[edit]

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 193

C++98 heap required *first to be the largest element there can be elements
equal to *first

LWG 2150

C++98 the definition of a sorted sequence was incorrect corrected

LWG 2166

C++98 the heap requirement did not match the
definition of

max heap

closely enough requirement improved See also