Defined in header
template<classT1,classT2,classU1,classU2>booloperator==(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (1)(until C++14)template<classT1,classT2,classU1,classU2>constexprbooloperator==(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs);(since C++14)template<classT1,classT2,classU1,classU2>booloperator!=(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (2)(until C++14)template<classT1,classT2,classU1,classU2>constexprbooloperator!=(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs);(since C++14)
(until C++20)template<classT1,classT2,classU1,classU2>booloperator<(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (3)(until C++14)template<classT1,classT2,classU1,classU2>constexprbooloperator<(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs);(since C++14)
(until C++20)template<classT1,classT2,classU1,classU2>booloperator<=(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (4)(until C++14)template<classT1,classT2,classU1,classU2>constexprbooloperator<=(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs);(since C++14)
(until C++20)template<classT1,classT2,classU1,classU2>booloperator>(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (5)(until C++14)template<classT1,classT2,classU1,classU2>constexprbooloperator>(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs);(since C++14)
(until C++20)template<classT1,classT2,classU1,classU2>booloperator>=(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (6)(until C++14)template<classT1,classT2,classU1,classU2>constexprbooloperator>=(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs);(since C++14)
(until C++20)template<classT1,classT2,classU1,classU2>constexprstd::common_comparison_category_t<synth-three-way-result<T1,U1>,synth-three-way-result<T2,U2>>operator<=>(conststd::pair<T1,T2>&lhs,conststd::pair<U1,U2>&rhs); (7) (since C++20)1,2) Tests if both elements of lhs and rhs are equal, that is, compares lhs.first with rhs.first and lhs.second with 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
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
.
(since C++26)3-6) Compares lhs and rhs lexicographically 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.second do not meet the
requirements.
7) Compares lhs and rhs lexicographically by
, that is, compares the first elements and only if they are equivalent, compares the second elements.
is the return type of synth-three-way.
The <, <=, >, >=, and != operators are
from operator<=> and operator== respectively.
(since C++20)Parameters
lhs, rhs - pairs to compare Return value
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)
Notes
The relational operators are defined in terms of each element's operator<.
(until C++20)The relational operators are defined in terms of
, 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)
macroValueStdFeature
__cpp_lib_constrained_equality
(C++26)Constrained operator== for
Example
Because operator< is defined for pairs, containers of pairs can be sorted.
Run this code
#include<algorithm>#include<iomanip>#include<iostream>#include<string>#include<utility>#include<vector>intmain(){std::vector<std::pair<int,std::string>>v={{2,"baz"},{2,"bar"},{1,"foo"}};std::sort(v.begin(),v.end());for(autop:v)std::cout<<'{'<<p.first<<", "<<std::quoted(p.second)<<"}\n";}Output:
{1, "foo"} {2, "bar"} {2, "baz"} Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++98 the descriptions of operators other than == and < were missing added
(
) C++98 type preconditions for boolean operations were missing added
C++98 comparison operators only accepted pairs of the same type accept pairs of different types See also