Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
template<class InputIt1,class InputIt2> bool equal( InputIt1 first1, InputIt1 last1, | (1) | (constexpr since C++20) |
template<class ExecutionPolicy,class ForwardIt1,class ForwardIt2> bool equal( ExecutionPolicy&& policy, | (2) | (since C++17) |
template<class InputIt1,class InputIt2,class BinaryPred> bool equal( InputIt1 first1, InputIt1 last1, | (3) | (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class BinaryPred> | (4) | (since C++17) |
template<class InputIt1,class InputIt2> bool equal( InputIt1 first1, InputIt1 last1, | (5) | (since C++14) (constexpr since C++20) |
template<class ExecutionPolicy,class ForwardIt1,class ForwardIt2> bool equal( ExecutionPolicy&& policy, | (6) | (since C++17) |
template<class InputIt1,class InputIt2,class BinaryPred> bool equal( InputIt1 first1, InputIt1 last1, | (7) | (since C++14) (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class BinaryPred> | (8) | (since C++17) |
Checks whether[
first1,
last1)
and a range starting fromfirst2 are equal:
[
first2,
last2)
.std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
Contents |
first1, last1 | - | the pair of iterators defining the firstrange of elements to compare |
first2, last2 | - | the pair of iterators defining the secondrange of elements to compare |
policy | - | theexecution policy to use |
p | - | binary predicate which returns true if the elements should be treated as equal. The signature of the predicate function should be equivalent to the following: bool pred(const Type1&a,const Type2&b); While the signature does not need to haveconst&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) |
Type requirements | ||
-InputIt1, InputIt2 must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt1, ForwardIt2 must meet the requirements ofLegacyForwardIterator. | ||
-BinaryPred must meet the requirements ofBinaryPredicate. |
Given\(\scriptsize N_1\)N1 asstd::distance(first1, last1) and\(\scriptsize N_2\)N2 asstd::distance(first2, last2):
InputIt1
andInputIt2
are bothLegacyRandomAccessIterator, andlast1- first1!= last2- first2 istrue, no comparison will be made.The overloads with a template parameter namedExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.equal (1) |
---|
template<class InputIt1,class InputIt2>constexpr//< since C++20bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2){for(; first1!= last1;++first1,++first2)if(!(*first1==*first2))returnfalse; returntrue;} |
equal (3) |
template<class InputIt1,class InputIt2,class BinaryPred>constexpr//< since C++20bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPred p){for(; first1!= last1;++first1,++first2)if(!p(*first1,*first2))returnfalse; returntrue;} |
equal (5) |
namespace detail{// random-access iterator implementation (allows quick range size detection)template<class RandomIt1,class RandomIt2>constexpr//< since C++20bool equal(RandomIt1 first1, RandomIt1 last1, RandomIt2 first2, RandomIt2 last2,std::random_access_iterator_tag,std::random_access_iterator_tag){if(last1- first1!= last2- first2)returnfalse; for(; first1!= last1;++first1,++first2)if(!(*first1==*first2))returnfalse; returntrue;} // input iterator implementation (needs to manually compare with “last2”)template<class InputIt1,class InputIt2>constexpr//< since C++20bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,std::input_iterator_tag,std::input_iterator_tag){for(; first1!= last1&& first2!= last2;++first1,++first2)if(!(*first1==*first2))returnfalse; return first1== last1&& first2== last2;}} template<class InputIt1,class InputIt2>constexpr//< since C++20bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2){ details::equal(first1, last1, first2, last2,typenamestd::iterator_traits<InputIt1>::iterator_category(),typenamestd::iterator_traits<InputIt2>::iterator_category());} |
equal (7) |
namespace detail{// random-access iterator implementation (allows quick range size detection)template<class RandomIt1,class RandomIt2,class BinaryPred>constexpr//< since C++20bool equal(RandomIt1 first1, RandomIt1 last1, RandomIt2 first2, RandomIt2 last2, BinaryPred p,std::random_access_iterator_tag,std::random_access_iterator_tag){if(last1- first1!= last2- first2)returnfalse; for(; first1!= last1;++first1,++first2)if(!p(*first1,*first2))returnfalse; returntrue;} // input iterator implementation (needs to manually compare with “last2”)template<class InputIt1,class InputIt2,class BinaryPred>constexpr//< since C++20bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p,std::input_iterator_tag,std::input_iterator_tag){for(; first1!= last1&& first2!= last2;++first1,++first2)if(!p(*first1,*first2))returnfalse; return first1== last1&& first2== last2;}} template<class InputIt1,class InputIt2,class BinaryPred>constexpr//< since C++20bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPred p){ details::equal(first1, last1, first2, last2, p,typenamestd::iterator_traits<InputIt1>::iterator_category(),typenamestd::iterator_traits<InputIt2>::iterator_category());} |
std::equal
should not be used to compare the ranges formed by the iterators fromstd::unordered_set,std::unordered_multiset,std::unordered_map, orstd::unordered_multimap because the order in which the elements are stored in those containers may be different even if the two containers store the same elements.
When comparing entire containersor string views(since C++17) for equality,operator== for the corresponding type are usually preferred.
Sequentialstd::equal
is not guaranteed to be short-circuit. E.g. if the first pair elements of both ranges do not compare equal, the rest of elements may also be compared. Non-short-circuit comparison may happen when the ranges are compared withstd::memcmp or implementation-specific vectorized algorithms.
The following code usesstd::equal
to test if a string is a palindrome.
#include <algorithm>#include <iomanip>#include <iostream>#include <string_view> constexprbool is_palindrome(conststd::string_view& s){return std::equal(s.cbegin(), s.cbegin()+ s.size()/2, s.crbegin());} void test(conststd::string_view& s){std::cout<<std::quoted(s)<<(is_palindrome(s)?" is":" is not")<<" a palindrome\n";} int main(){ test("radar"); test("hello");}
Output:
"radar" is a palindrome"hello" is not a palindrome
(C++11) | finds the first element satisfying specific criteria (function template)[edit] |
returnstrue if one range is lexicographically less than another (function template)[edit] | |
finds the first position where two ranges differ (function template)[edit] | |
searches for the first occurrence of a range of elements (function template)[edit] | |
(C++20) | determines if two sets of elements are the same (algorithm function object)[edit] |
function object implementingx== y (class template)[edit] | |
returns range of elements matching a specific key (function template)[edit] |