成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

三種排序

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

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

用法:<=>

#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:這是對兩個浮點數進行比較。對于浮點數,標準庫返回的是std::partial_ordering,因為浮點數有NaN值的存在,這使得它們之間的比較不是嚴格的全序。std::partial_ordering允許結果是<、>、==或者unordered。

我們可以使用gcc代碼靜態變量來查看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`:這是對兩個整數進行比較。對于整數,標準庫返回的是`std::strong_ordering`,因為整數的比較是嚴格的全序關系,沒有不確定的情況。`std::strong_ordering`只會返回`<`、`>`或`==`。

同理,可以使用下面4個靜態成員。

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,靜態成員為:

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

equal與equivalent

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

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

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

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

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

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

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

傳統比較運算符的限制:

  • 如果 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。

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

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

2009-08-11 15:51:08

C#運算符算術運算符

2009-08-12 15:02:49

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

2023-11-15 15:54:17

C++運算符

2021-09-08 14:43:07

VRAR元宇宙

2009-08-12 15:20:18

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

2011-07-15 01:34:36

C++重載運算符

2009-08-12 09:30:10

C#??運算符

2025-02-24 11:16:20

2009-08-12 10:47:03

C#運算符重載

2009-08-12 14:49:33

C#移位運算符

2009-08-11 14:16:38

C# New運算符

2009-08-12 13:35:22

C#關系運算符

2009-09-01 10:08:57

C#運算符

2009-08-12 14:29:32

C#條件運算符

2009-08-19 17:33:35

C# 操作符

2009-08-12 14:23:09

C#邏輯運算符

2009-09-04 13:18:10

C#允許運算符重載

2009-08-12 10:27:12

C#運算符重載運算符重載實例

2009-08-12 10:07:51

C#運算符

2009-08-14 10:16:57

C#運算符重載
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级黄色片免费观看 | 国产亚洲欧美在线 | 亚洲日韩中文字幕 | 国产一区二区在线视频 | 99国产精品久久久久 | 天天操夜夜拍 | 国产高清在线精品一区二区三区 | 欧美激情精品久久久久 | 国产精品午夜电影 | 日韩电影中文字幕 | 成人中文字幕在线观看 | 亚洲精品久久久久久久久久久 | 久久精品国产一区 | 久久综合一区二区三区 | 中文字幕 国产精品 | 国产ts人妖系列高潮 | 日韩一区二区三区在线视频 | 欧美日韩国产一区二区三区 | 欧美一区视频 | 亚洲黄色在线免费观看 | 天天操 天天操 | 欧美一区二区三区电影 | 中文字幕亚洲国产 | 亚洲精品在线免费看 | 一区二区三区国产在线观看 | 国产美女在线观看 | 天堂精品视频 | 久久久噜噜噜www成人网 | 91免费福利在线 | 亚洲一区久久 | 欧美成人精品在线 | 欧美日韩精品亚洲 | 农村真人裸体丰满少妇毛片 | 午夜精品久久 | 日韩欧美一区二区三区在线播放 | 亚洲人成一区二区三区性色 | 精品视频一区二区三区四区 | 五月免费视频 | 久久国产精品一区二区三区 | 美女视频网站久久 | 免费人成在线观看网站 |