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

< cpp‎ | utility‎ | tuple
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等字符串转换
(C++17)
(C++17)
 
std::tuple
成员函数
非成员函数
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
推导指引(C++17)
辅助类
 
定义于头文件 <tuple>
(1)
template< class... TTypes, class... UTypes >

bool operator==( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator==( const std::tuple<TTypes...>& lhs,

                           const std::tuple<UTypes...>& rhs );
(C++14 起)
(2)
template< class... TTypes, class... UTypes >

bool operator!=( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator!=( const std::tuple<TTypes...>& lhs,

                           const std::tuple<UTypes...>& rhs );
(C++14 起)
(C++20 前)
(3)
template< class... TTypes, class... UTypes >

bool operator<( const std::tuple<TTypes...>& lhs,

                const std::tuple<UTypes...>& rhs );
(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator<( const std::tuple<TTypes...>& lhs,

                          const std::tuple<UTypes...>& rhs );
(C++14 起)
(C++20 前)
(4)
template< class... TTypes, class... UTypes >

bool operator<=( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator<=( const std::tuple<TTypes...>& lhs,

                           const std::tuple<UTypes...>& rhs );
(C++14 起)
(C++20 前)
(5)
template< class... TTypes, class... UTypes >

bool operator>( const std::tuple<TTypes...>& lhs,

                const std::tuple<UTypes...>& rhs );
(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator>( const std::tuple<TTypes...>& lhs,

                          const std::tuple<UTypes...>& rhs );
(C++14 起)
(C++20 前)
(6)
template< class... TTypes, class... UTypes >

bool operator>=( const std::tuple<TTypes...>& lhs,

                 const std::tuple<UTypes...>& rhs );
(C++11 起)
(C++14 前)
template< class... TTypes, class... UTypes >

constexpr bool operator>=( const std::tuple<TTypes...>& lhs,

                           const std::tuple<UTypes...>& rhs );
(C++14 起)
(C++20 前)
template< class... TTypes, class... UTypes >

constexpr /* see below */ operator<=>( const std::tuple<TTypes...>& lhs,

                                       const std::tuple<UTypes...>& rhs );
(7) (C++20 起)
1-2) 比较 tuple lhs 的每个元素和 tuple rhs 的对应元素。
3-6)operator< 以字典序比较 lhsrhs ,即比较首元素,若等价则比较第二元素,若均等价则比较第三元素,以此类推。

对于非空 tuple , (3) 等价于

if (std::get<0>(lhs) < std::get<0>(rhs)) return true;
if (std::get<0>(rhs) < std::get<0>(lhs)) return false;
if (std::get<1>(lhs) < std::get<1>(rhs)) return true;
if (std::get<1>(rhs) < std::get<1>(lhs)) return false;
...
return std::get<N - 1>(lhs) < std::get<N - 1>(rhs);
7)合成三路比较以字典序比较 lhsrhs ,即比较首元素,若等价则比较第二元素,若均等价则比较第三元素,以此类推。

返回类型为 lhsrhs 中的每对元素上的三路比较结果的共用比较类别类型。对于空 tuple ,返回类型为 std::strong_ordering
对于非空 tuple , (7) 等价于

if (auto c = synth_three_way(std::get<0>(lhs), std::get<0>(lhs)); c != 0) return c;
if (auto c = synth_three_way(std::get<1>(lhs), std::get<1>(lhs)); c != 0) return c;
...
return synth_three_way(std::get<N - 1>(lhs), std::get<N - 1>(lhs));
其中 synth_three_way 是进行合成三路比较的仅用于阐释的函数对象。

sizeof...(TTypes)sizeof...(UTypes) 必须相等,否则程序为谬构,或对于 operator<=> ,该运算符函数不参与重载决议 (C++20 起)。以上代码中的 N 等于两者。

所有比较运算符是短路的;它们在确定结果所必须的比较之外不访问 tuple 元素。

合成三路比较

给定二个对象类型 TU 、作为左操作数的 const T 左值 t 、作为右操作数的 const U 左值 u合成三路比较定义为:

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

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

(C++20 起)

参数

lhs, rhs - 要比较的 tuple

返回值

1) 若对于所有 [0, sizeof...(Types)) 中的 i 有 std::get<i>(lhs) == std::get<i>(rhs) 则为 true ,否则为 false 。对二个空 tuple 返回 true
2) !(lhs == rhs)
3)lhs 中的首个不等价元素小于 rhs 中的则为 true ,若 rhs 中的首个不等价元素小于 lhs 中的或无不等价元素则为 false 。对两个空 tuple 返回 false
4) !(rhs < lhs)
5) rhs < lhs
6) !(lhs < rhs)
7) 首对不等价元素间的关系,若存在不等价元素,否则为 std::strong_ordering::equal 。对两个空 tuple 返回 std::strong_ordering::equal

示例

因为 operator< 对 tuples 定义,故能排序 tuple 的容器。

#include <iostream>
#include <tuple>
#include <vector>
#include <algorithm>
int main()
{
    std::vector<std::tuple<int, std::string, float>> v;
    v.emplace_back(2, "baz", -0.1);
    v.emplace_back(2, "bar", 3.14);
    v.emplace_back(1, "foo", 100.1);
    std::sort(v.begin(), v.end());
 
    for(auto p: v) {
        std::cout << "(" << std::get<0>(p) << ", " << std::get<1>(p)
                  << ", " << std::get<2>(p) << ")\n";
    }
}

输出:

(1, foo, 100.1)
(2, bar, 3.14)
(2, baz, -0.1)

参阅