--- title: "Algorithms" --- A set of algorithms from the STL. If `ETL_NO_STL` is defined then the ETL implements its own reverse engineered versions. Otherwise, the ETL will often be a wrapper around the STL's implementation. Functions returning pair will either use `std::pair` or, if `ETL_NO_STL` is defined, `etl::pair`. **Note:** Some algorithms will be `constexpr`, dependent on the compiler support and ETL setup. ## swap Only defined if `ETL_NO_STL` is defined. ```cpp template void swap(T& a, T& b) ETL_NOEXCEPT ``` **Description** Swaps two values. --- ```cpp template void swap(T(&a)[N], T(&b)[N]) ETL_NOEXCEPT ``` **Description** Swaps two arrays. ## iter_swap ```cpp template void iter_swap(TIterator1 a, TIterator2 b) ``` **Description** Swaps the elements pointed to by two iterators. ## swap_ranges ```cpp template TIterator2 swap_ranges(T1terator1 first1, T1terator1 last1, TIterator2 first2) ``` **Description** Swaps two ranges of elements. ## copy ```cpp template TOutputIterator copy(TInputIterator sb, TInputIterator se, TOutputIterator db) ``` **Description** Copies the elements in the range, defined by `sb`, `se`, to another range beginning at `db`. **constexpr** This function is `constexpr` under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as `1`, and C++14 is supported. ## copy_s **ETL extension** ```cpp template TOutputIterator copy_s(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TOutputIterator o_end) ``` **Description** A safer four parameter version that will stop copying when either iterator reaches the end of its range. **constexpr** This function is `constexpr` under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as `1`, and C++14 is supported. ## copy_n ```cpp template TOutputIterator copy_n(TInputIterator begin, TSize n, TOutputIterator result) ``` **Description** Copies exactly `n` values from the range beginning at `begin` to the range beginning at `result`. **constexpr** This function is `constexpr` under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as `1`, and C++14 is supported. ## copy_n_s **ETL extension** ```cpp template TOutputIterator copy_n_s(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TOutputIterator o_end) ``` **Description** A safer version that will stop copying when either `n` items have been copied or the output iterator reaches the end of its range. --- ```cpp template TOutputIterator copy_n_s(TIterator i_begin, TSize1 n1, TOutputIterator o_begin, TSize1 n2,) ``` **Description** A safer version that will stop copying when either n1 or n2 items have been copied. **constexpr** This function is constexpr under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as `1`, and C++14 is supported. ## copy_if ```cpp template ETL_CONSTEXPR14 TOutputIterator copy_if(TIterator begin, TIterator end, TOutputIterator out, TUnaryPredicate predicate) ``` **Description** Only copies the elements for which the predicate predicate returns `true`. ## copy_if_s **ETL extension** ```cpp template ETL_CONSTEXPR14 TOutputIterator copy_if_s(TIterator i_begin, TIterator i_end, TOutputIterator o_begin, TOutputIterator o_end, TUnaryPredicate predicate) ``` **Description** A safer version that will stop copying when either iterator reaches the end of its range. ## copy_n_if **ETL extension** ```cpp template ETL_CONSTEXPR14 TOutputIterator copy_n_if(TIterator begin, TSize n, TOutputIterator out, TUnaryPredicate predicate) ``` **Description** A combination of `copy_if` and `copy_n`. ## reverse_copy ```cpp template TIterator2 reverse_copy(TIterator1 sb, TIterator1 se, TIterator2 db) ``` **Description** Copies the elements from the range `sb`, `se` to another range beginning at `db` in such a way that the elements in the new range are in reverse order. **constexpr** This function is `constexpr` under the following conditions. - The STL is in use and C++20 is supported. - The STL is not in use. ## copy_backward ```cpp template TIterator2 copy_backward(TIterator1 sb, TIterator1 se, TIterator2 de) ``` **Description** Copies the elements from the range, defined by `sb`, `se` to another range ending at `db`. The elements are copied in reverse order. **constexpr** This function is constexpr under the following conditions. - The STL is in use and C++20 is supported. - The STL is not in use. ## count ```cpp template typename iterator_traits::difference_type count(TIterator first, TIterator last, const T& value) ``` **Description** Counts the elements that are equal to value. ## count_if ```cpp template typename iterator_traits::difference_type count_if(TIterator first, TIterator last, TUnaryPredicate predicate) ``` **Description** Counts the elements where predicate returns `true`. ## equal ```cpp template bool equal(TIterator1 first1, TIterator1 last1, TIterator2 first2) ``` **Description** Returns `true` if the range [`first1`, `last1`) is equal to the range []`first2`, `first2 + distance(first2, last2)`). ## lexicographical_compare ```cpp template bool lexicographical_compare(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2) ``` **Description** Checks if the range [`first1`, `last1`) is lexicographically less than the range [`first2`, `last2`), using the 'less-than' operator. --- ```cpp template bool lexicographical_compare(TIterator1 first1, TIterator1 last1, TIterator2 first2, TIterator2 last2, TCompare compare) ``` **Description** Checks if the range [`first1`, `last1`) is lexicographically less than the range [`first2`, `last2`), using `compare`. ## make_heap ```cpp template void make_heap(TIterator first, TIterator last) ``` **Description** Makes a heap from the range [`first`, `last`). --- ```cpp template void make_heap(TIterator first, TIterator last, TCompare compare) ``` **Description** Makes a heap from the range [`first`, `last`). Uses `compare` to compare elements. ## is_heap ```cpp template bool is_heap(TIterator first, TIterator last) ``` **Description** Returns `true` is the range [`first`, `last`) is a heap, otherwise `false`. --- ```cpp template bool is_heap(TIterator first, TIterator last, TCompare compare) ``` **Description** Returns `true` is the range [`first`, `last`) is a heap, otherwise `false`. Uses `compare` to compare elements. ## pop_heap ```cpp template void pop_heap(TIterator first, TIterator last) ``` **Description** Removes the first element from the heap. --- ```cpp template void pop_heap(TIterator first, TIterator last, TCompare compare) ``` **Description** Removes the first element from the heap. Uses `compare` to compare elements. ## push_heap ```cpp template void push_heap(TIterator first, TIterator last) ``` **Description** Inserts the element at the position `last - 1` into the heap. --- ```cpp template void push_heap(TIterator first, TIterator last, TCompare compare) ``` **Description** Inserts the element at the position `last - 1` into the heap. Uses `compare` to compare elements. ## min ```cpp template ETL_CONSTEXPR const T& min(const T& a, const T& b) ``` **Description** Returns the minimum of the two values. --- ```cpp template ETL_CONSTEXPR const T& min(const T& a, const T& b, TCompare compare) ``` **Description** Returns the value where compare returns `true` if `a is less than `b`. ## max ```cpp template ETL_CONSTEXPR const T& max(const T& a, const T& b) ``` **Description** Returns the maximum of the two values. --- ```cpp template ETL_CONSTEXPR const T& max(const T& a, const T& b, TCompare compare) ``` **Description** Returns the value where `compare` returns `true` if `a` is less than `b`. ## minmax ```cpp template pair minmax(const T& a, const T& b) ``` **Description** Returns the lesser and greater values. --- ```cpp template pair minmax(const T& a, const T& b, TCompare compare) ``` **Description** Returns the lesser and greater values using `compare`. ## min_element ```cpp template TIterator min_element(TIterator begin, TIterator end) ``` **Description** Finds the smallest element in the range [`begin`, `end`). --- ```cpp template TIterator min_element(TIterator begin, TIterator end, TCompare compare) ``` **Description** Finds the smallest element in the range [`begin`, `end`) using `compare`. ## max_element ```cpp template TIterator max_element(TIterator begin, TIterator end) ``` **Description** Finds the greatest element in the range [`begin`, `end`). --- ```cpp template TIterator max_element(TIterator begin, TIterator end, TCompare compare) ``` **Description** Finds the greatest element in the range [`begin`, `end`) using `compare`. ## minmax_element ```cpp template pair minmax_element(TIterator begin, TIterator end) ``` **Description** Finds the smallest and greatest element in the range [`begin`, `end`). --- ```cpp template pair minmax_element(TIterator begin, TIterator end, TCompare compare) ``` **Description** Finds the smallest and greatest element in the range [`begin`, `end`) using `compare`. ## multimin **ETL extension** C++11 only Variadic functions to return the minimum value, or iterator to value, from a variable length parameter list. ```cpp template constexpr const T& multimin(const T& t, const Tx&... tx) ``` **Description** Returns the minimum of the supplied arguments. --- ```cpp template constexpr const T& multimin_compare(TCompare compare, const T& t, const Tx&... tx) ``` **Description** Returns the minimum of the supplied arguments. Uses `compare` to compare values. --- ```cpp template constexpr const TIterator& multimin_iter(const TIterator& t, const TIteratorx&... tx) ``` **Description** Returns the minimum of the dereferenced supplied arguments. --- ```cpp template constexpr const TIterator& multimin_iter_compare(TCompare compare, const TIterator& t, const TIteratorx&... tx) ``` **Description** Returns the minimum of the dereferenced supplied arguments. Uses `compare` to compare values. ### Example ```cpp int minimum; minimum = etl::multimin(1, 2, 3, 4, 5, 6, 7, 8)); minimum = etl::multimin_compare(std::less(), 1, 2, 3, 4, 5, 6, 7, 8)); minimum = etl::multimin_compare(std::greater(), 1, 2, 3, 4, 5, 6, 7, 8)); int i[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int* p_minimum; p_minimum = etl::multimin_iter(&i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7])); p_minimum = etl::multimin_iter_compare(std::less(), &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7])); p_minimum = etl::multimin_iter_compare(std::greater(), &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7])); ``` --- ## multimax **ETL extension** C++11 only Variadic functions to return the maximum value, or iterator to value, from a variable length parameter list. ```cpp template constexpr const T& multimax(const T& t, const Tx&... tx) ``` **Description** Returns the maximum of the supplied arguments. --- ```cpp template constexpr const T& multimax_compare(TCompare compare, const T& t, const Tx&... tx) ``` **Description** Returns the maximum of the supplied arguments. Uses `compare` to compare values. --- ```cpp template constexpr const TIterator& multimax_iter(const TIterator& t, const TIteratorx&... tx) ``` **Description** Returns the maximum of the dereferenced supplied arguments. --- ```cpp template constexpr const TIterator& multimax_iter_compare(TCompare compare, const TIterator& t, const TIteratorx&... tx) ``` **Description** Returns the maximum of the dereferenced supplied arguments. Uses `compare` to compare values. ### Example ```cpp int maximum; maximum = etl::multimax(1, 2, 3, 4, 5, 6, 7, 8)); maximum = etl::multimax_compare(std::less(), 1, 2, 3, 4, 5, 6, 7, 8)); maximum = etl::multimax_compare(std::greater(), 1, 2, 3, 4, 5, 6, 7, 8)); int i[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int* p_maximum; p_maximum = etl::multimax_iter(&i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7])); p_maximum = etl::multimax_iter_compare(std::less(), &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7])); p_maximum = etl::multimax_iter_compare(std::greater(), &i[0], &i[1], &i[2], &i[3], &i[4], &i[5], &i[6], &i[7])); ``` ## move ```cpp template TIterator2 move(TIterator1 sb, TIterator1 se, TIterator2 db) ``` **Description** Moves the elements in the range `sb`, `se` to another range beginning at `db`. **constexpr** This function is constexpr under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as 1, and C++14 is supported. ## move_s **ETL extension** ```cpp template TOutputIterator move_s(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TOutputIterator o_end) ``` **Description** A safer four parameter version that will stop moving when either iterator reaches the end of its range. **constexpr** This function is constexpr under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as `1`, and C++14 is supported. ## move_backward ```cpp template TIterator2 move_backward(TIterator1 sb, TIterator1 se, TIterator2 de) ``` **Description** Moves the elements in the range `sb`, `se` to another range ending at `de`. The elements are moved in reverse order. **constexpr** This function is constexpr under the following conditions. - The STL is in use and C++20 is supported. - The iterator is non-pointer or the type is not trivially copyable and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, built-in `memcpy` is supported, and C++14 is supported. - The iterator is a pointer, the type is trivially copyable, `ETL_FORCE_CONSTEXPR_ALGORITHMS` is defined as 1, and C++14 is supported. ## reverse ```cpp template void reverse(TIterator b, TIterator e) ``` **Description** Reverses the order of the elements in the range `b`, `e`. ## for_each_if **ETL extension** ```cpp template TUnaryFunction for_each_if(TIterator begin, const TIterator end, TUnaryFunction function, TUnaryPredicate predicate) ``` **Description** Applies function to each element if `predicate` returns `true`. ## for_each_n **ETL extension** ```cpp template TIterator for_each_n(TIterator begin, TSize n, TUnaryFunction function) ``` **Description** Applies function to `n` elements, starting from `begin`. ## for_each_n_if **ETL extension** ```cpp template TIterator for_each_n_if(TIterator begin, TSize n, TUnaryFunction function, TUnaryPredicate predicate) ``` **Description** Combination of `for_each_if` and `for_each_n`. ## fill ```cpp template void fill(TIterator first, TIterator last, const TValue& value) ``` **Description** Assigns the given `value` to the elements in the range `first`, `last`. ## fill_n ```cpp template TIterator fill_n(TIterator first, TSize count, const TValue& value) ``` **Description** Assigns the given `value` to the first `count` elements in the range beginning at `first`. ## find ```cpp template TIterator find(TIterator first, TIterator last, const T& value) ``` **Description** Searches for an element equal to `value`. ## find_end ```cpp template TIterator1 find_end(TIterator1 b, TIterator1 e, TIterator2 sb, TIterator2 se) ``` **Description** Searches for the last occurrence of the sequence `b`, `e` in the range `sb`, `be`. --- ```cpp template TIterator1 find_end(TIterator1 b, TIterator1 e, TIterator2 sb, TIterator2 se, TPredicate predicate) ``` **Description** Searches for the last occurrence of the sequence `b`, `e` in the range `sb`, `be`, using `predicate`. ## find_if ```cpp template TIterator find_if(TIterator first, TIterator last, TUnaryPredicate predicate) ``` **Description** Searches for the first element that satisfies the `predicate`. ## find_if_not ```cpp template TIterator find_if_not(TIterator begin, TIterator end, TUnaryPredicate predicate) ``` **Description** Searches for the first element that does not satisfy the `predicate`. ## lower_bound ```cpp template TIterator lower_bound(TIterator first, TIterator last, const TValue& value) ``` **Description** Searches for the first element in the range [`first`, `last`) which is **not* ordered before `value`. **Return** An iterator to the element, or `last` if not found. --- ```cpp template TIterator lower_bound(TIterator first, TIterator last, const TValue& value, TCompare compare) ``` **Description** Searches for the first element in the range [`first`, `last`) which is **not* ordered before `value`. Uses `compare` to compare elements. **Return** An iterator to the element, or `last` if not found. ## upper_bound ```cpp template TIterator upper_bound(TIterator first, TIterator last, const TValue& value) ``` **Description** Searches for the first element in the range [`first`, `last`) which is ordered after `value`. **Return** An iterator to the element, or `last` if not found. --- ```cpp template TIterator upper_bound(TIterator first, TIterator last, const TValue& value, TCompare compare) ``` **Description** Searches for the first element in the range [`first`, `last`) which is ordered after `value`. Uses `compare` to compare elements. **Return** An iterator to the element, or `last` if not found. ## equal_range ```cpp template pair equal_range(TIterator first, TIterator last, const TValue& value) ``` **Description** Returns a range containing all elements equivalent to `value` in the range [`first`, `last`). **Return** A `pair` containing a pair of iterators. `first` is is the result of `lower_bound(first, last)`. `last` is is the result of `upper_bound(first, last)`. --- ```cpp template pair equal_range(TIterator first, TIterator last, const TValue& value, TCompare compare) ``` **Description** Returns a range containing all elements equivalent to `value` in the range [`first`, `last`). Uses compare to `compare` elements. **Return** A `pair` containing a pair of iterators. `first` is is the result of `lower_bound(first, last)`. `last` is is the result of `upper_bound(first, last)`. ## binary_find **ETL extension** ```cpp template TIterator binary_find(TIterator begin, TIterator end, const TValue& value) ``` **Description** Finds the first item in a sorted container that matches the `value`. Returns an iterator to the `value` or `end`. --- ```cpp template TIterator binary_find(TIterator begin, TIterator end, const TValue& value, TBinaryPredicate predicate, TBinaryEquality equality) ``` **Description** Finds the first item in a sorted container that matches the value. Returns an iterator to the `value` or `end`. Comparison and equality predicates are supplied. --- ## search ```cpp template TIterator1 search(TIterator1 first, TIterator1 last, TIterator2 search_first, TIterator2 search_last) ``` **Description** Searches for the first occurrence of the sequence of elements `first`, `last` in the range `search_first`, `search_last`. --- ```cpp template TIterator1 search(TIterator1 first, TIterator1 last, TIterator2 search_first, TIterator2 search_last, TCompare compare) ``` **Description** Searches for the first occurrence of the sequence of elements `first`, `last` in the range `search_first`, `search_last` Uses `compare` to check equality of the values. ## binary_search ```cpp template bool binary_search(TIterator first, TIterator last, const T& value) ``` **Description** Checks if an element equivalent to value appears within the range [`first`, `last`). ```cpp template bool binary_search(TIterator first, TIterator last, const T& value, Compare compare) ``` **Description** Checks if an element equivalent to value appears within the range [`first`, `last`). Uses `compare` to check equality of the values. ## all_of ```cpp template bool all_of(TIterator begin, TIterator end, TUnaryPredicate predicate) ``` **Description** Checks if `predicate` returns `true` for all elements in the range [`begin`, `end`). ## any_of ```cpp template bool any_of(TIterator begin, TIterator end, TUnaryPredicate predicate) ``` **Description** Checks if `predicate` returns `true` for at least one element in the range [`begin`, `end`). ## none_of ```cpp template bool none_of(TIterator begin, TIterator end, TUnaryPredicate predicate) ``` **Description** Checks if `predicate` returns `true` for no elements in the range [`begin`, `end`). ## is_permutation ```cpp template bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2) ``` **Description** Returns `true` if there exists a permutation of the elements in the range [`begin1`, `end1`) that makes that range equal to the second range. --- ```cpp template bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2, TIterator2 end2) ``` **Description** Returns `true` if there exists a permutation of the elements in the range [`begin1`, `end1`) that makes that range equal to the second range. --- ```cpp template bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2, TBinaryPredicate predicate) ``` **Description** Returns `true` if there exists a permutation of the elements in the range [`begin1`, `end1`) that makes that range equal to the second range. Uses `predicate` to checks elements in the range. --- ```cpp template bool is_permutation(TIterator1 begin1, TIterator1 end1, TIterator2 begin2, TIterator2 end2, TBinaryPredicate predicate) ``` **Description** Returns `true` if there exists a permutation of the elements in the range [`begin1`, `end1`) that makes that range equal to the second range. Uses `predicate` to checks elements in the range. ## is_partitioned ```cpp template bool is_partitioned(TIterator begin, TIterator end, TUnaryPredicate predicate) ``` **Description** Returns `true` if all elements in the range [`begin`, `end`) that satisfy the predicate appear before all elements that don't. Also returns `true` if [`begin`, `end`) is empty. ## partition_point ```cpp template TIterator partition_point(TIterator begin, TIterator end, TUnaryPredicate predicate) ``` **Description** Examines the partitioned range [`begin`, `end`) and locates the end of the first partition according to `predicate`. ## partition_copy ```cpp template pair partition_copy(TSource begin, TSource end, TDestinationTrue destination_true, TDestinationFalse destination_false, TUnaryPredicate predicate) ``` **Description** Copies the elements from the range [`begin`, `end`) to two different ranges depending on the value returned by the `predicate`. The elements that satisfy `predicate` are copied to the range beginning at `destination_true`. The rest of the elements are copied to the range beginning at `destination_false`. ## partition_transform **ETL extension** ### One input range ```cpp template pair partition_transform(TSource begin, TSource end, TDestinationTrue destination_true, TDestinationFalse destination_false, TUnaryFunctionTrue function_true, TUnaryFunctionFalse function_false, TUnaryPredicate predicate) ``` **Description** Transforms data from the source to one of two destinations. If `predicate` returns `true` then the source data if modified by `function_true` and stored in `destination_true`. If `predicate` returns `false` then the source data if modified by `function_false` and stored in `destination_false`. --- ### Two input ranges ```cpp template pair partition_transform(TSource1 begin1, TSource1 end1, TSource2 begin2, TDestinationTrue destination_true, TDestinationFalse destination_false, TBinaryFunctionTrue function_true, TBinaryFunctionFalse function_false, TBinaryPredicate predicate) ``` **Description** Transforms data from the source to one of two destinations. If `predicate` returns `true` then the source data if modified by `function_true` and stored in `destination_true`. If `predicate` returns `false` then the source data if modified by `function_false` and stored in `destination_false`. ## rotate ```cpp template TIterator rotate(TIterator first, TIterator middle, TIterator last) ``` **Description** Performs a left rotation on the range of elements. ## transform_s **ETL extension** ```cpp template void transform_s(TIterator i_begin, TIterator i_end, TOutputIterator o_begin, TOutputIterator o_end, TUnaryFunction function) ``` **Description** A safer version that will stop transforming when either iterator reaches the end of its range. ## transform_n **ETL extension** ### One input range ```cpp template void transform_n(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TUnaryFunction function) ``` **Description** Transform over `n` elements. --- ### Two input ranges ```cpp template void transform_n(TInputIterator1 i_begin1, TInputIterator2 i_begin2, TSize n, TOutputIterator o_begin, TBinaryFunction function) ``` **Description** Transform over `n` elements. ## transform_if **ETL extension** ### One input range ```cpp template TOutputIterator transform_if(TInputIterator i_begin, TInputIterator i_end, TOutputIterator o_begin, TUnaryFunction function, TUnaryPredicate predicate) ``` **Description** Transforms data from the source based on a predicate. If `predicate` returns `true` then the source data if modified by function and stored in the output range. If `predicate` returns `false` then the source data is ignored. --- ### Two input ranges ```cpp template TOutputIterator transform_if(TInputIterator1 i_begin1, TInputIterator1 i_end1, TInputIterator2 i_begin2, TOutputIterator o_begin, TBinaryFunction function, TBinaryPredicate predicate) ``` **Description** Transforms data from the source based on a predicate. If `predicate` returns `true` then the source data if modified by function and stored in the output range. If `predicate` returns `false` then the source data is ignored. ## transform_n_if **ETL extension** ### One input range ```cpp template TOutputIterator transform_if(TInputIterator i_begin, TSize n, TOutputIterator o_begin, TUnaryFunction function, TUnaryPredicate predicate) ``` **Description** Transforms data from the source based on a predicate for `n` items. If `predicate` returns `true` then the source data if modified by function and stored in the output range. If `predicate` returns `false` then the source data is ignored. --- ### Two input ranges ```cpp template TOutputIterator transform_if(TInputIterator1 i_begin1, TSize n, TInputIterator2 i_begin2, TOutputIterator o_begin, TBinaryFunction function, TBinaryPredicate predicate) ``` **Description** Transforms data from the source based on a predicate for `n` items. If `predicate` returns `true` then the source data if modified by function and stored in the output range. If `predicate` returns `false` then the source data is ignored. ## shell_sort **ETL extension** https://en.wikipedia.org/wiki/Shellsort ```cpp template void shell_sort(TIterator first, TIterator last) ``` **Description** Sorts a range using the shell sort algorithm. --- ```cpp template void shell_sort(TIterator first, TIterator last, TCompare compare) ``` **Description** Sorts a range using the shell sort algorithm, using `compare`. ## insertion_sort **ETL extension** https://en.wikipedia.org/wiki/Insertion_sort ```cpp template void insertion_sort(TIterator first, TIterator last) ``` **Description** Sorts a range using the insertion sort algorithm. --- ```cpp template void insertion_sort(TIterator first, TIterator last, TCompare compare) ``` **Description** Sorts a range using the insertion sort algorithm. ## heap_sort **ETL extension** https://en.wikipedia.org/wiki/Heapsort ```cpp template void heap_sort(TIterator first, TIterator last) ``` Sorts a range using the heap sort algorithm. Since: `16.2.0` --- ```cpp template void heap_sort(TIterator first, TIterator last, TCompare compare) ``` **Description** Sorts a range using the heap sort algorithm, using `compare`. Since: `16.2.0` ## selection_sort **ETL extension** https://en.wikipedia.org/wiki/Selectionsort ```cpp template void selection_sort(TIterator first, TIterator last) ``` **Description** Sorts a range using the selection sort algorithm. From: `20.7.0` --- ```cpp template void selection_sort(TIterator first, TIterator last, TCompare compare) ``` **Description** Sorts a range using the selection sort algorithm. From: `20.7.0` ## sort ```cpp template void sort(TIterator first, TIterator last) ``` **Description** If `ETL_NO_STL` is defined then uses `etl::shell_sort`, otherwise calls `std::sort`. --- ```cpp template void sort(TIterator first, TIterator last, TCompare compare) ``` **Description** If `ETL_NO_STL` is defined then uses `etl::shell_sort`, otherwise calls `std::sort`. ## stable_sort ```cpp template void stable_sort(TIterator first, TIterator last) ``` **Description** If `ETL_NO_STL` is defined then uses `etl::insertion_sort`, otherwise calls `std::stable_sort`. --- ```cpp template void stable_sort(TIterator first, TIterator last, TCompare compare) ``` **Description** If `ETL_NO_STL` is defined then uses `etl::insertion_sort`, otherwise calls `std::stable_sort`. ## is_sorted ```cpp template bool is_sorted(TIterator begin, TIterator end) ``` **Description** Returns true is the range is sorted. --- ```cpp template bool is_sorted(TIterator begin, TIterator end, TCompare compare) ``` **Description** Returns true is the range is sorted. ## is_sorted_until ```cpp template TIterator is_sorted_until(TIterator begin, TIterator end) ``` **Description** Returns an iterator to the first element that is not sorted --- ```cpp template TIterator is_sorted_until(TIterator begin, TIterator end, TCompare compare) ``` **Description** Returns an iterator to the first element that is not sorted ## clamp ```cpp template ETL_CONSTEXPR const T& clamp(const T& value, const T& low, const T& high ) ``` **Description** Clamps `value` between two limits. --- ```cpp template ETL_CONSTEXPR const T& clamp(const T& value, const T& low, const T& high, TCompare compare) ``` **Description** Clamps `value` between two limits, using `compare`. ## accumulate ```cpp template ETL_CONSTEXPR14 T accumulate(TIterator first, TIterator last, T sum) ``` Computes the sum of the given `sum` and the elements in the range `first`, `last`. ```cpp template ETL_CONSTEXPR14 T accumulate(TIterator first, TIterator last, T init, TBinaryOperation operation) ``` Computes the sum of the given `init` and the elements in the range `first`, `last`. Uses `operation` to compute the final value. ## remove ```cpp template TIterator remove(TIterator first, TIterator last, const T& value) ``` **Description** Removes all elements that are equal to value. ## remove_if ```cpp template TIterator remove_if(TIterator first, TIterator last, TPredicate predicate) ``` **Description** Removes all elements that satisfy `predicate`.