operator==,!=,<,<=,>,>=,<=>(std::map)
std::map
<map>
bool operator==( const std::map <Key, T, Compare, Alloc>& lhs,
bool operator!=( const std::map <Key, T, Compare, Alloc>& lhs,
bool operator< ( const std::map <Key, T, Compare, Alloc>& lhs,
bool operator<=( const std::map <Key, T, Compare, Alloc>& lhs,
bool operator> ( const std::map <Key, T, Compare, Alloc>& lhs,
bool operator>=( const std::map <Key, T, Compare, Alloc>& lhs,
/* see below */
operator<=>( const std::map <Key, T, Compare, Alloc>& lhs,
(constexpr since C++26)
Compares the contents of two map
s.
Let value_type
be the value type of map
(i.e., typename map::value_type):
return std::distance (lhs.begin(), lhs.end())
== std::distance (rhs.begin(), rhs.end())
&& std::equal (lhs.begin(), lhs.end(), rhs.begin());
return std::equal (lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
(since C++14)value_type
is not EqualityComparable, the behavior is undefined.rhs.begin(), rhs.end());.
-
value_type
is not LessThanComparable. - operator< does not establish total order.
rhs.begin(), rhs.end(),
synth-three-way ).-
T
does not modelthree_way_comparable
. - operator< is not defined for values of type (possibly const-qualified)
value_type
. - operator< does not establish total order.
The <
, <=
, >
, >=
, and !=
operators are synthesized from operator<=> and operator== respectively.
[edit] Parameters
map
s whose contents to compare
[edit] Return value
Operator | lhs and rhs are equal |
lhs is lexicographically greater |
rhs is lexicographically greater |
---|---|---|---|
operator== | true | false | |
operator!= | false | true | |
operator< | false | false | true |
operator<= | true | ||
operator> | false | true | false |
operator>= | true | ||
operator<=> | a value equal to 0 | a value greater then 0 | a value less than 0 |
[edit] Complexity
map
.map
.[edit] Notes
The relational operators are defined in terms of value_type
's operator<.
The relational operators are not defined. The rewritten candidate operator<=> will be selected by overload resolution.
operator<=> uses value_type
's operator<=> if possible, or value_type
's operator< otherwise. Notably, if the value_type
does not itself provide operator<=>, but is implicitly convertible to a three-way comparable type, that conversion will be used instead of operator<.
These non-member comparison operators do not use Compare
to compare elements.
[edit] Example
#include <cassert> #include <compare> #include <map> int main() { std::map <int, char> a{{1, 'a'}, {2, 'b'}, {3, 'c'}}; std::map <int, char> b{{1, 'a'}, {2, 'b'}, {3, 'c'}}; std::map <int, char> c{{7, 'Z'}, {8, 'Y'}, {9, 'X'}, {10, 'W'}}; assert ("" "Compare equal containers:" && (a != b) == false && (a == b) == true && (a < b) == false && (a <= b) == true && (a > b) == false && (a >= b) == true && (a <=> b) != std::weak_ordering::less && (a <=> b) != std::weak_ordering::greater && (a <=> b) == std::weak_ordering::equivalent && (a <=> b) >= 0 && (a <=> b) <= 0 && (a <=> b) == 0 && "Compare non equal containers:" && (a != c) == true && (a == c) == false && (a < c) == true && (a <= c) == true && (a > c) == false && (a >= c) == false && (a <=> c) == std::weak_ordering::less && (a <=> c) != std::weak_ordering::equivalent && (a <=> c) != std::weak_ordering::greater && (a <=> c) < 0 && (a <=> c) != 0 && (a <=> c) <= 0 && ""); }
[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 3431 | C++20 | operator<=> did not require T to model three_way_comparable
|
requires |