Constrained algorithms (since C++20)
From cppreference.com
                    
                                        
                    
                    
                                                            
                    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.
Contents | 
[edit] Constrained algorithms
|   Defined in header  
<algorithm>  | |
|   Defined in  namespace  
std::ranges  | |
 Non-modifying sequence operations | |
|    (C++20)(C++20)(C++20)  | 
   checks if a predicate is true for all, any or none of the elements in a range   (niebloid)  | 
|    (C++20)  | 
   applies a function to a range of elements  (niebloid)  | 
|    (C++20)  | 
   applies a function object to the first n elements of a sequence   (niebloid)  | 
|    (C++20)(C++20)  | 
   returns the number of elements satisfying specific criteria   (niebloid)  | 
|    (C++20)  | 
   finds the first position where two ranges differ   (niebloid)  | 
|    (C++20)  | 
   determines if two sets of elements are the same   (niebloid)  | 
|    returns true if one range is lexicographically less than another   (niebloid)  | |
|    (C++20)(C++20)(C++20)  | 
   finds the first element satisfying specific criteria  (niebloid)  | 
|    (C++23)(C++23)(C++23)  | 
   finds the last element satisfying specific criteria  (niebloid)  | 
|    (C++20)  | 
   finds the last sequence of elements in a certain range   (niebloid)  | 
|    (C++20)  | 
   searches for any one of a set of elements   (niebloid)  | 
|    (C++20)  | 
   finds the first two adjacent items that are equal (or satisfy a given predicate)   (niebloid)  | 
|    (C++20)  | 
   searches for a range of elements   (niebloid)  | 
|    (C++20)  | 
   searches for a number consecutive copies of an element in a range   (niebloid)  | 
|    (C++23)(C++23)  | 
   checks if the range contains the given element or subrange  (niebloid)  | 
|    (C++23)  | 
   checks whether a range starts with another range  (niebloid)  | 
|    (C++23)  | 
   checks whether a range ends with another range  (niebloid)  | 
 Modifying sequence operations | |
|    (C++20)(C++20)  | 
   copies a range of elements to a new location   (niebloid)  | 
|    (C++20)  | 
   copies a number of elements to a new location    (niebloid)  | 
|    (C++20)  | 
   copies a range of elements in backwards order   (niebloid)  | 
|    (C++20)  | 
   moves a range of elements to a new location    (niebloid)  | 
|    (C++20)  | 
   moves a range of elements to a new location in backwards order  (niebloid)  | 
|    (C++20)  | 
   assigns a range of elements a certain value   (niebloid)  | 
|    (C++20)  | 
   assigns a value to a number of elements   (niebloid)  | 
|    (C++20)  | 
   applies a function to a range of elements   (niebloid)  | 
|    (C++20)  | 
   saves the result of a function in a range   (niebloid)  | 
|    (C++20)  | 
   saves the result of N applications of a function   (niebloid)  | 
|    (C++20)(C++20)  | 
   removes elements satisfying specific criteria   (niebloid)  | 
|    (C++20)(C++20)  | 
   copies a range of elements omitting those that satisfy specific criteria   (niebloid)  | 
|    (C++20)(C++20)  | 
   replaces all values satisfying specific criteria with another value   (niebloid)  | 
|    (C++20)(C++20)  | 
   copies a range, replacing elements satisfying specific criteria with another value   (niebloid)  | 
|    (C++20)  | 
   swaps two ranges of elements   (niebloid)  | 
|    (C++20)  | 
   reverses the order of elements in a range   (niebloid)  | 
|    (C++20)  | 
   creates a copy of a range that is reversed   (niebloid)  | 
|    (C++20)  | 
   rotates the order of elements in a range   (niebloid)  | 
|    (C++20)  | 
   copies and rotate a range of elements   (niebloid)  | 
|    (C++20)  | 
   randomly re-orders elements in a range   (niebloid)  | 
|    shifts elements in a range  (niebloid)  | |
|    (C++20)  | 
   selects n random elements from a sequence  (niebloid)  | 
|    (C++20)  | 
   removes consecutive duplicate elements in a range   (niebloid)  | 
|    (C++20)  | 
   creates a copy of some range of elements that contains no consecutive duplicates   (niebloid)  | 
 Partitioning operations | |
|    (C++20)  | 
   determines if the range is partitioned by the given predicate    (niebloid)  | 
|    (C++20)  | 
   divides a range of elements into two groups   (niebloid)  | 
|    (C++20)  | 
   copies a range dividing the elements into two groups   (niebloid)  | 
|    (C++20)  | 
   divides elements into two groups while preserving their relative order   (niebloid)  | 
|    (C++20)  | 
   locates the partition point of a partitioned range   (niebloid)  | 
 Sorting operations | |
|    (C++20)  | 
   checks whether a range is sorted into ascending order   (niebloid)  | 
|    (C++20)  | 
   finds the largest sorted subrange   (niebloid)  | 
|    (C++20)  | 
   sorts a range into ascending order   (niebloid)  | 
|    (C++20)  | 
   sorts the first N elements of a range   (niebloid)  | 
|    (C++20)  | 
   copies and partially sorts a range of elements   (niebloid)  | 
|    (C++20)  | 
   sorts a range of elements while preserving order between equal elements   (niebloid)  | 
|    (C++20)  | 
   partially sorts the given range making sure that it is partitioned by the given element   (niebloid)  | 
 Binary search operations (on sorted ranges) | |
|    (C++20)  | 
   returns an iterator to the first element not less than the given value  (niebloid)  | 
|    (C++20)  | 
   returns an iterator to the first element greater than a certain value  (niebloid)  | 
|    (C++20)  | 
   determines if an element exists in a partially-ordered range   (niebloid)  | 
|    (C++20)  | 
   returns range of elements matching a specific key  (niebloid)  | 
 Set operations (on sorted ranges) | |
|    (C++20)  | 
   merges two sorted ranges   (niebloid)  | 
|    (C++20)  | 
   merges two ordered ranges in-place   (niebloid)  | 
|    (C++20)  | 
   returns true if one sequence is a subsequence of another   (niebloid)  | 
|    (C++20)  | 
   computes the difference between two sets   (niebloid)  | 
|    (C++20)  | 
   computes the intersection of two sets   (niebloid)  | 
|    computes the symmetric difference between two sets   (niebloid)  | |
|    (C++20)  | 
   computes the union of two sets   (niebloid)  | 
 Heap operations | |
|    (C++20)  | 
   checks if the given range is a max heap  (niebloid)  | 
|    (C++20)  | 
   finds the largest subrange that is a max heap   (niebloid)  | 
|    (C++20)  | 
   creates a max heap out of a range of elements   (niebloid)  | 
|    (C++20)  | 
   adds an element to a max heap   (niebloid)  | 
|    (C++20)  | 
   removes the largest element from a max heap   (niebloid)  | 
|    (C++20)  | 
   turns a max heap into a range of elements sorted in ascending order   (niebloid)  | 
 Minimum/maximum operations | |
|    (C++20)  | 
   returns the greater of the given values   (niebloid)  | 
|    (C++20)  | 
   returns the largest element in a range   (niebloid)  | 
|    (C++20)  | 
   returns the smaller of the given values   (niebloid)  | 
|    (C++20)  | 
   returns the smallest element in a range   (niebloid)  | 
|    (C++20)  | 
   returns the smaller and larger of two elements   (niebloid)  | 
|    (C++20)  | 
   returns the smallest and the largest elements in a range   (niebloid)  | 
|    (C++20)  | 
   clamps a value between a pair of boundary values   (niebloid)  | 
 Permutation operations | |
|    (C++20)  | 
   determines if a sequence is a permutation of another sequence   (niebloid)  | 
|    (C++20)  | 
   generates the next greater lexicographic permutation of a range of elements   (niebloid)  | 
|    (C++20)  | 
   generates the next smaller lexicographic permutation of a range of elements   (niebloid)  | 
[edit] Constrained numeric operations
|   Defined in header  
<numeric>  | |
|   Defined in  namespace  
std::ranges  | |
|    (C++23)  | 
   fills a range with successive increments of the starting value   (niebloid)  | 
[edit] Constrained fold operations
|   Defined in header  
<algorithm>  | |
|   Defined in  namespace  
std::ranges  | |
|    (C++23)  | 
  left-folds a range of elements  (niebloid)  | 
|    (C++23)  | 
  left-folds a range of elements using the first element as an initial value  (niebloid)  | 
|    (C++23)  | 
  right-folds a range of elements  (niebloid)  | 
|    (C++23)  | 
  right-folds a range of elements using the last element as an initial value  (niebloid)  | 
|    (C++23)  | 
  left-folds a range of elements, and returns a pair (iterator, value)  (niebloid)  | 
|   left-folds a range of elements using the first element as an initial value, and returns a pair (iterator, optional)  (niebloid)  | |
[edit] Constrained uninitialized memory algorithms
|   Defined in header  
<memory>  | |
|   Defined in  namespace  
std::ranges  | |
|    (C++20)  | 
   copies a range of objects to an uninitialized area of memory   (niebloid)  | 
|    (C++20)  | 
   copies a number of objects to an uninitialized area of memory   (niebloid)  | 
|    (C++20)  | 
   copies an object to an uninitialized area of memory, defined by a range   (niebloid)  | 
|    (C++20)  | 
   copies an object to an uninitialized area of memory, defined by a start and a count   (niebloid)  | 
|    (C++20)  | 
   moves a range of objects to an uninitialized area of memory   (niebloid)  | 
|    (C++20)  | 
   moves a number of objects to an uninitialized area of memory   (niebloid)  | 
|    constructs objects by default-initialization in an uninitialized area of memory, defined by a range  (niebloid)  | |
|    constructs objects by default-initialization in an uninitialized area of memory, defined by a start and count   (niebloid)  | |
|    constructs objects by value-initialization in an uninitialized area of memory, defined by a range  (niebloid)  | |
|    constructs objects by value-initialization in an uninitialized area of memory, defined by a start and a count  (niebloid)  | |
|    (C++20)  | 
   destroys a range of objects   (niebloid)  | 
|    (C++20)  | 
   destroys a number of objects in a range   (niebloid)  | 
|    (C++20)  | 
   destroys an object at a given address   (niebloid)  | 
|    (C++20)  | 
   creates an object at a given address   (niebloid)  | 
[edit] Return types
|   Defined in header  
<algorithm>  | |
|   Defined in  namespace  
std::ranges  | |
|    (C++20)  | 
   provides a way to store an iterator and a function object as a single unit   (class template)  | 
|    (C++20)  | 
   provides a way to store two iterators as a single unit   (class template)  | 
|    (C++20)  | 
   provides a way to store two iterators as a single unit   (class template)  | 
|    (C++20)  | 
   provides a way to store three iterators as a single unit   (class template)  | 
|    (C++20)  | 
   provides a way to store three iterators as a single unit   (class template)  | 
|    (C++20)  | 
   provides a way to store two objects or references of the same type as a single unit   (class template)  | 
|    (C++20)  | 
   provides a way to store an iterator and a boolean flag as a single unit   (class template)  | 
|    (C++23)  | 
   provides a way to store an iterator and a value as a single unit   (class template)  | 
|    (C++23)  | 
   provides a way to store an iterator and a value as a single unit   (class template)  | 
[edit] Notes
| Feature-test macro | Value | Std | Comment | 
|---|---|---|---|
__cpp_lib_find_last | 
202207L | (C++23) | std::ranges::find_last | 
__cpp_lib_ranges | 
201911L | (C++20) | Ranges library and constrained algorithms | 
__cpp_lib_ranges_contains | 
202207L | (C++23) | std::ranges::contains | 
__cpp_lib_ranges_fold | 
202207L | (C++23) | std::ranges fold algorithms
 | 
__cpp_lib_ranges_iota | 
202202L | (C++23) | std::ranges::iota | 
__cpp_lib_ranges_starts_ends_with | 
202106L | (C++23) | std::ranges::starts_with, std::ranges::ends_with | 
__cpp_lib_shift | 
201806L | (C++20) | std::shift_left and std::shift_right | 
| 202202L | (C++23) | std::ranges::shift_left and std::ranges::shift_right |