constexpr bool operator==( const std::pair<T1, T2>& lhs,
constexpr bool operator!=( const std::pair<T1, T2>& lhs,
constexpr bool operator<( const std::pair<T1, T2>& lhs,
constexpr bool operator<=( const std::pair<T1, T2>& lhs,
constexpr bool operator>( const std::pair<T1, T2>& lhs,
constexpr bool operator>=( const std::pair<T1, T2>& lhs,
Tests if both elements of
lhsand
rhsare equal, that is, compares
lhs.firstwith
rhs.firstand
lhs.secondwith
rhs.second.
The behavior is undefined if the type and value category of either lhs.first == rhs.first or lhs.second == rhs.second do not meet the BooleanTestable requirements.
(until C++26)This overload participates in overload resolution only if both decltype(lhs.first == rhs.first) and decltype(lhs.second == rhs.second) model boolean-testable
.
Compares
lhsand
rhslexicographically by
operator<, that is, compares the first elements and only if they are equivalent, compares the second elements. The behavior is undefined if the type and value category of any of
lhs.first < rhs.first,
rhs.first < lhs.first, or
lhs.second < rhs.seconddo not meet the
BooleanTestablerequirements.
7)Compares
lhsand
rhslexicographically by
synth-three-way, that is, compares the first elements and only if they are equivalent, compares the second elements.
synth-three-way-resultis the return type of
synth-three-way
.
The <
, <=
, >
, >=
, and !=
operators are synthesized from operator<=> and operator== respectively.
1) true if both lhs.first == rhs.first and lhs.second == rhs.second, otherwise false.
2) !(lhs == rhs)
3) If lhs.first < rhs.first, returns true. Otherwise, if rhs.first < lhs.first, returns false. Otherwise, if lhs.second < rhs.second, returns true. Otherwise, returns false.
4) !(rhs < lhs)
5) rhs < lhs
6) !(lhs < rhs)
[edit] NotesThe relational operators are defined in terms of each element's operator<.
(until C++20)The relational operators are defined in terms of synth-three-way, which uses operator<=> if possible, or operator< otherwise.
Notably, if an element type does not itself provide operator<=>, but is implicitly convertible to a three-way comparable type, that conversion will be used instead of operator<.
(since C++20) [edit] ExampleBecause operator< is defined for pairs, containers of pairs can be sorted.
#include <algorithm> #include <iomanip> #include <iostream> #include <string> #include <utility> #include <vector> int main() { std::vector<std::pair<int, std::string>> v = {{2, "baz"}, {2, "bar"}, {1, "foo"}}; std::sort(v.begin(), v.end()); for (auto p : v) std::cout << '{' << p.first << ", " << std::quoted(p.second) << "}\n"; }
Output:
{1, "foo"} {2, "bar"} {2, "baz"}[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 296 C++98 the descriptions of operators other than==
and <
were missing added LWG 2114
pair
s of the same type accept pair
s of different types [edit] See also
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4