operator==,!=,<,<=,>,>=,<=>(std::map)

From cppreference.com
< cpp‎ | container‎ | map

 
 
Containers library
Sequence
(C++11)
Associative
Unordered associative
Adaptors
Views
(C++20)
 
std::map
Member functions
Element access
Iterators
Capacity
Modifiers
(C++17)
Lookup
Observers
Non-member functions
(C++20)
operator==operator!=operator<operator>operator<=operator>=operator<=>
(until C++20)(until C++20)(until C++20)(until C++20)(until C++20)(C++20)
Deduction guides (C++17)
 
Defined in header <map>
template< class Key, class T, class Compare, class Alloc >

bool operator==( const std::map<Key,T,Compare,Alloc>& lhs,

                 const std::map<Key,T,Compare,Alloc>& rhs );
(1)
template< class Key, class T, class Compare, class Alloc >

bool operator!=( const std::map<Key,T,Compare,Alloc>& lhs,

                 const std::map<Key,T,Compare,Alloc>& rhs );
(2) (until C++20)
template< class Key, class T, class Compare, class Alloc >

bool operator<( const std::map<Key,T,Compare,Alloc>& lhs,

                const std::map<Key,T,Compare,Alloc>& rhs );
(3) (until C++20)
template< class Key, class T, class Compare, class Alloc >

bool operator<=( const std::map<Key,T,Compare,Alloc>& lhs,

                 const std::map<Key,T,Compare,Alloc>& rhs );
(4) (until C++20)
template< class Key, class T, class Compare, class Alloc >

bool operator>( const std::map<Key,T,Compare,Alloc>& lhs,

                const std::map<Key,T,Compare,Alloc>& rhs );
(5) (until C++20)
template< class Key, class T, class Compare, class Alloc >

bool operator>=( const std::map<Key,T,Compare,Alloc>& lhs,

                 const std::map<Key,T,Compare,Alloc>& rhs );
(6) (until C++20)
template< class Key, class T, class Compare, class Alloc >

/* see below */ operator<=>( const std::map<Key,T,Compare,Alloc>& lhs,

                             const std::map<Key,T,Compare,Alloc>& rhs );
(7) (since C++20)

Compares the contents of two maps.

1-2) Checks if the contents of lhs and rhs are equal, that is, they have the same number of elements and each element in lhs compares equal with the element in rhs at the same position.
3-6) Compares the contents of lhs and rhs lexicographically. The comparison is performed by a function equivalent to std::lexicographical_compare. This comparison ignores the map's ordering Compare.
7) Compares the contents of lhs and rhs lexicographically. The comparison is performed as if by calling std::lexicographical_compare_three_way on two maps with a function object performing synthesized three-way comparison (see below). The return type is same as the result type of synthesized three-way comparison. This comparison ignores the map's ordering Compare.

Given two const E lvalues lhs and rhs as left hand operand and right hand operand respectively (where E is std::pair<const Key, T>), synthesized three-way comparison is defined as:

lhs < rhs ? std::weak_ordering::less :
rhs < lhs ? std::weak_ordering::greater :
            std::weak_ordering::equivalent
  • otherwise, synthesized three-way comparison is not defined, and operator<=> does not participate in overload resolution.
The behavior of operator<=> is undefined if three_way_comparable_with or boolean-testable is satisfied but not modeled, or operator< is used but E and < do not establish a total order.

The <, <=, >, >=, and != operators are synthesized from operator<=> and operator== respectively.

(since C++20)

Parameters

lhs, rhs - maps whose contents to compare
-
T, Key must meet the requirements of EqualityComparable in order to use overloads (1-2).
-
Key must meet the requirements of LessThanComparable in order to use overloads (3-6). The ordering relation must establish total order.

Return value

1) true if the contents of the maps are equal, false otherwise
2) true if the contents of the maps are not equal, false otherwise
3) true if the contents of the lhs are lexicographically less than the contents of rhs, false otherwise
4) true if the contents of the lhs are lexicographically less than or equal to the contents of rhs, false otherwise
5) true if the contents of the lhs are lexicographically greater than the contents of rhs, false otherwise
6) true if the contents of the lhs are lexicographically greater than or equal to the contents of rhs, false otherwise
7) The relative order of the first pair of non-equivalent elements in lhs and rhs if there are such elements, lhs.size() <=> rhs.size() otherwise.

Complexity

1-2) Constant if lhs and rhs are of different size, otherwise linear in the size of the map
3-7) Linear in the size of the map

Example

#include <iostream>
#include <map>
 
int main()
{
    std::map<int, char> alice{{1, 'a'}, {2, 'b'}, {3, 'c'}};
    std::map<int, char> bob{{7, 'Z'}, {8, 'Y'}, {9, 'X'}, {10, 'W'}};
    std::map<int, char> eve{{1, 'a'}, {2, 'b'}, {3, 'c'}};
 
    std::cout << std::boolalpha;
 
    // Compare non equal containers
    std::cout << "alice == bob returns " << (alice == bob) << '\n';
    std::cout << "alice != bob returns " << (alice != bob) << '\n';
    std::cout << "alice <  bob returns " << (alice < bob) << '\n';
    std::cout << "alice <= bob returns " << (alice <= bob) << '\n';
    std::cout << "alice >  bob returns " << (alice > bob) << '\n';
    std::cout << "alice >= bob returns " << (alice >= bob) << '\n';
 
    std::cout << '\n';
 
    // Compare equal containers
    std::cout << "alice == eve returns " << (alice == eve) << '\n';
    std::cout << "alice != eve returns " << (alice != eve) << '\n';
    std::cout << "alice <  eve returns " << (alice < eve) << '\n';
    std::cout << "alice <= eve returns " << (alice <= eve) << '\n';
    std::cout << "alice >  eve returns " << (alice > eve) << '\n';
    std::cout << "alice >= eve returns " << (alice >= eve) << '\n';
}

Output:

alice == bob returns false
alice != bob returns true
alice <  bob returns true
alice <= bob returns true
alice >  bob returns false
alice >= bob returns false
 
alice == eve returns true
alice != eve returns false
alice <  eve returns false
alice <= eve returns true
alice >  eve returns false
alice >= eve returns true