AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-07-12 17:20:00 98觀看
導讀本節將引入C++20的另一個知識點:宇宙飛船運算符/三向比較運算符。三種排序三向比較運算符<=>又稱為宇宙飛船運算符,返回值有三種排序,下面從gcc源碼角度來深入聊一下。注:懶人版,本節示例已更新星球。用法:<=>#include <com

本節將引入C++20的另一個知識點:宇宙飛船運算符/三向比較運算符。o8l28資訊網——每日最新資訊28at.com

三種排序

三向比較運算符<=>又稱為宇宙飛船運算符,返回值有三種排序,下面從gcc源碼角度來深入聊一下。o8l28資訊網——每日最新資訊28at.com

注:懶人版,本節示例已更新星球。o8l28資訊網——每日最新資訊28at.com

用法:<=>o8l28資訊網——每日最新資訊28at.com

#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;}

輸出:o8l28資訊網——每日最新資訊28at.com

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

我們可以使用gcc代碼靜態變量來查看partial_ordering到底是小于、大于、等于、無序:o8l28資訊網——每日最新資訊28at.com

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

如果我們強制轉換便會報錯:o8l28資訊網——每日最新資訊28at.com

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個靜態成員。o8l28資訊網——每日最新資訊28at.com

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,這也解釋了為什么輸出的類型不一樣。o8l28資訊網——每日最新資訊28at.com

除了partial_ordering、strong_ordering之外,<=>還可能返回weak_ordering,靜態成員為:o8l28資訊網——每日最新資訊28at.com

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

equal與equivalent

在上面的三種ording可以看到對于等于出現了兩個:equal與equivalent,這兩者有什么區別呢?o8l28資訊網——每日最新資訊28at.com

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

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

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

https://en.cppreference.com/w/cpp/utility/compare/strong_orderingo8l28資訊網——每日最新資訊28at.com

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

三向比較運算符(<=>)使得在一次操作中就能夠確定兩個值的排序關系,而傳統的比較運算符則需要多次比較。o8l28資訊網——每日最新資訊28at.com

傳統比較運算符的限制:o8l28資訊網——每日最新資訊28at.com

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

這些限制表明,傳統的比較運算符不能一次性確定兩個值的完全關系,而是需要多次比較來獲得完整的結果。o8l28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-100712-0.htmlC++20那些事之宇宙飛船運算符

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 統計學入門:時間序列分析基礎知識詳解

下一篇: 聊聊2024年Rust加密生態系統

標簽:
  • 熱門焦點
Top