自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++20那些事之宇宙飛船運算符

開發(fā) 前端
如果比較在被比較的項目之間產(chǎn)生強排序,則等價和相等是相同的。之所以有兩個詞來表示它,是因為這對于其他類型的排序是不一樣的。弱和部分根本沒有相等性;它們只提供等價性。

本節(jié)將引入C++20的另一個知識點:宇宙飛船運算符/三向比較運算符。

三種排序

三向比較運算符<=>又稱為宇宙飛船運算符,返回值有三種排序,下面從gcc源碼角度來深入聊一下。

注:懶人版,本節(jié)示例已更新星球。

用法:<=>

#include <compare>
#include <iostream>

int main() {
   auto c1 = 1.1 <=> 2.2;
   auto c2 = -1 <=> 1;
   std::cout << typeid(c1).name() << std::endl;
   std::cout << typeid(c2).name() << std::endl;
}

輸出:

St16partial_ordering
St15strong_ordering
  1. 1.1 <=> 2.2:這是對兩個浮點數(shù)進行比較。對于浮點數(shù),標準庫返回的是std::partial_ordering,因為浮點數(shù)有NaN值的存在,這使得它們之間的比較不是嚴格的全序。std::partial_ordering允許結果是<、>、==或者unordered。

我們可以使用gcc代碼靜態(tài)變量來查看partial_ordering到底是小于、大于、等于、無序:

static const partial_ordering less;
static const partial_ordering equivalent;
static const partial_ordering greater;
static const partial_ordering unordered;

如果我們強制轉換便會報錯:

comp.cc:6:36: error: conversion from 'std::partial_ordering' to non-scalar type 'std::strong_ordering' requested
    6 |   std::strong_ordering c1 = 1.1 <=> 2.2;
2. `-1 <=> 1`:這是對兩個整數(shù)進行比較。對于整數(shù),標準庫返回的是`std::strong_ordering`,因為整數(shù)的比較是嚴格的全序關系,沒有不確定的情況。`std::strong_ordering`只會返回`<`、`>`或`==`。

同理,可以使用下面4個靜態(tài)成員。

static const strong_ordering less;
static const strong_ordering equal;
static const strong_ordering equivalent;
static const strong_ordering greater;

因此,c1的類型是std::partial_ordering,而c2的類型是std::strong_ordering,這也解釋了為什么輸出的類型不一樣。

除了partial_ordering、strong_ordering之外,<=>還可能返回weak_ordering,靜態(tài)成員為:

static const weak_ordering less;
static const weak_ordering equivalent;
static const weak_ordering greater;

equal與equivalent

在上面的三種ording可以看到對于等于出現(xiàn)了兩個:equal與equivalent,這兩者有什么區(qū)別呢?

這里直接看cppreference,兩者之間沒有區(qū)別。然而,std::strong_ordering 是唯一定義相等的類別。所有其他類別僅定義等價。也正好驗證了上面的靜態(tài)成員,對于string_ordering有兩個,其他的只有equivalent。

如果比較在被比較的項目之間產(chǎn)生強排序,則等價和相等是相同的。之所以有兩個詞來表示它,是因為這對于其他類型的排序是不一樣的。弱和部分根本沒有相等性;它們只提供等價性。

等價意味著兩個對象可以比較相等。相等意味著更強的東西;如果它們比較相等,則可以在任何 const 用法中用一個替換另一個:只要 a == b 為真,f(a) == f(b) 的屬性就為真,其中 f 表示僅讀取可通過參數(shù)的公共 const 成員訪問的比較突出狀態(tài)的函數(shù)。如果類型的比較允許相等(這是強排序的要求),那么它也允許等價。因此,對于強排序比較,它們是相同的。

https://en.cppreference.com/w/cpp/utility/compare/strong_ordering

為什么使用三向比較運算符?

三向比較運算符(<=>)使得在一次操作中就能夠確定兩個值的排序關系,而傳統(tǒng)的比較運算符則需要多次比較。

傳統(tǒng)比較運算符的限制:

  • 如果 a == b 為假,你無法知道 a < b 還是 a > b。
  • 如果 a != b 為真,你無法知道 a < b 還是 a > b。
  • 如果 a < b 為假,你無法知道 a == b 還是 a > b。
  • 如果 a > b 為假,你無法知道 a == b 還是 a < b。
  • 如果 a <= b 為真,你無法知道 a == b 還是 a < b。
  • 如果 a >= b 為真,你無法知道 a == b 還是 a > b。

這些限制表明,傳統(tǒng)的比較運算符不能一次性確定兩個值的完全關系,而是需要多次比較來獲得完整的結果。

責任編輯:武曉燕 來源: 光城
相關推薦

2009-08-11 15:51:08

C#運算符算術運算符

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2023-11-15 15:54:17

C++運算符

2024-12-18 11:30:00

C++20比較運算符

2009-08-12 15:20:18

C#賦值運算符復合賦值運算符

2021-09-08 14:43:07

VRAR元宇宙

2011-07-15 01:34:36

C++重載運算符

2009-08-12 09:30:10

C#??運算符

2009-08-12 14:49:33

C#移位運算符

2009-08-19 17:33:35

C# 操作符

2025-02-24 11:16:20

2009-08-12 10:47:03

C#運算符重載

2009-09-01 10:08:57

C#運算符

2009-08-12 13:35:22

C#關系運算符

2009-08-12 14:29:32

C#條件運算符

2009-08-11 14:16:38

C# New運算符

2009-08-12 14:23:09

C#邏輯運算符

2011-07-15 10:08:11

C++運算符重載

2009-09-04 13:18:10

C#允許運算符重載

2009-08-12 10:27:12

C#運算符重載運算符重載實例
點贊
收藏

51CTO技術棧公眾號