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

来自cppreference.com
< cpp‎ | utility‎ | pair
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
std::pair
成员函数
非成员函数
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
(C++11)
推导指引(C++17)
辅助类
(C++11)
 
定义于头文件 <utility>
(1)
template< class T1, class T2 >
bool operator==( const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs );
(C++14 前)
template< class T1, class T2 >

constexpr bool operator==( const std::pair<T1,T2>& lhs,

                           const std::pair<T1,T2>& rhs );
(C++14 起)
(2)
template< class T1, class T2 >
bool operator!=( const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs );
(C++14 前)
template< class T1, class T2 >

constexpr bool operator!=( const std::pair<T1,T2>& lhs,

                           const std::pair<T1,T2>& rhs );
(C++14 起)
(C++20 前)
(3)
template< class T1, class T2 >
bool operator<( const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs );
(C++14 前)
template< class T1, class T2 >

constexpr bool operator<( const std::pair<T1,T2>& lhs,

                          const std::pair<T1,T2>& rhs );
(C++14 起)
(C++20 前)
(4)
template< class T1, class T2 >
bool operator<=( const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs );
(C++14 前)
template< class T1, class T2 >

constexpr bool operator<=( const std::pair<T1,T2>& lhs,

                           const std::pair<T1,T2>& rhs );
(C++14 起)
(C++20 前)
(5)
template< class T1, class T2 >
bool operator>( const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs );
(C++14 前)
template< class T1, class T2 >

constexpr bool operator>( const std::pair<T1,T2>& lhs,

                          const std::pair<T1,T2>& rhs );
(C++14 起)
(C++20 前)
(6)
template< class T1, class T2 >
bool operator>=( const std::pair<T1,T2>& lhs, const std::pair<T1,T2>& rhs );
(C++14 前)
template< class T1, class T2 >

constexpr bool operator>=( const std::pair<T1,T2>& lhs,

                           const std::pair<T1,T2>& rhs );
(C++14 起)
(C++20 前)
template< class T1, class T2 >

constexpr /* see below */ operator<=>( const std::pair<T1,T2>& lhs,

                                       const std::pair<T1,T2>& rhs );
(7) (C++20 起)
1-2) 测试 lhs 和 rhs 的两个元素是否均相等,即比较 lhs.firstrhs.firstlhs.secondrhs.second
3-6)operator< 按字典序比较 lhsrhs ,即比较首元素,然后仅若它们等价,再比较第二元素。
7)合成三路比较按字典序比较 lhsrhs ,即比较首元素,然后仅若它们等价,再比较第二元素。
返回类型为 T1T2 上的合成三路比较类型的结果类型的共用比较类别类型

<<=>>=!= 运算符分别从 operator<=>operator== 合成

(C++20 起)

合成三路比较

给定对象类型 T ,分别作为左操作数和右操作数的二个 const T 左值 lhsrhs合成三路比较定义为:

  • 若满足 std::three_way_comparable_with<T, T> ,则等价于 lhs <=> rhs;
  • 否则,若以 operator< 比较二个 const T 左值为良构且结果类型满足 boolean-testable ,则等价于
lhs < rhs ? std::weak_ordering::less :
rhs < lhs ? std::weak_ordering::greater :
            std::weak_ordering::equivalent
  • 否则不定义合成三路比较,这使得 operator<=> 不参与重载决议。

three_way_comparable_withboolean-testable 被满足但未被实现,则 operator<=> 的行为未定义。

(C++20 起)

参数

lhs, rhs - 要比较的 pair

返回值

1)lhs.first == rhs.firstlhs.second == rhs.second 则为 true ,否则为 false
2) !(lhs == rhs)
3)lhs.first<rhs.first 则返回 true 。否则,若 rhs.first<lhs.first 则返回 false 。否则,若 lhs.second<rhs.second 则返回 true 。否则返回 false
4) !(rhs < lhs)
5) rhs < lhs
6) !(lhs < rhs)
7)synth_three_way(lhs.first, rhs.first) 不等于 0 则为它,否则为 synth_three_way(lhs.second, rhs.second) ,其中 synth_three_way 是仅用于阐释的进行合成三路比较的函数对象。

示例

因为 operator< 为 pair 定义,故 pair 的容器能排序。

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <string>
 
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 << "," << p.second << ")\n";
    }
}

输出:

(1,foo)
(2,bar)
(2,baz)