0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++ std::tie函數(shù)的作用和用法

冬至子 ? 來(lái)源:iDoitnow ? 作者:艱默 ? 2023-07-18 17:28 ? 次閱讀

函數(shù)原型

C++中std::tie函數(shù)的作用就是從元素引用中生成一個(gè)tuple元組,其在頭文件中定義,其函數(shù)原型如下:

template< class... Types >
std::tuple< Types&... > tie( Types&... args ) noexcept; //C++11起, C++14前

template< class... Types >
constexpr std::tuple< Types&... > tie( Types&... args ) noexcept;//C++14起

其中參數(shù) args 為構(gòu)造 tuple 所用的零或更多左值參數(shù)。其返回值為含的std::tuple對(duì)象。

作用和用法

1. 解包 tuple 和 pair

std::tie 可以用于解包 tuple 和 pair,因?yàn)?std::tuple 擁有從 pair 的轉(zhuǎn)換賦值。

注:元組tuple可以將不同類(lèi)型的元素存放在一起,可以理解為pair的擴(kuò)展(pair只能包含兩個(gè)元素,而tuple可以多個(gè))。

std::tuple擁有從 pair 的轉(zhuǎn)換賦值的主要原因就是:tuple的實(shí)現(xiàn)中重載了 operator=,其部分原型如下:

template< class U1, class U2 >
tuple& operator=( const std::pair< U1, U2 >& p );//C++11 起, C++20 前

因此,std::tie可以用于pair的解包:

std::set< int > set;
std::set< int >::iterator iter;
bool result;
std::tie(iter, result) = set.insert(value);//解包 insert 的返回值為 iter 與 result
std::tie(std::ignore, result) = set.insert(value);//使用std::ignore忽略insert的返回pair中的第一個(gè)元素

:std::ignore 是令 std::tie 在解包 std::tuple 時(shí)作為不使用的參數(shù)的占位符使用,即忽略某些 tuple 中的某些返回值。

2. 批量賦值

std::tie 可以將多個(gè)變量的引用整合成一個(gè) tuple,進(jìn)而通過(guò)另外一個(gè)同類(lèi)型的 tuple 進(jìn)行批量賦值。

tuple< string, double, int > tup("idoit", 98.8, 1);
string name;
double score;
int rank;

//通過(guò)變量tup實(shí)現(xiàn)對(duì)name、score、rank的批量賦值操作
tie(name, score, rank) = tup;

3. 比較結(jié)構(gòu)體

可以將結(jié)構(gòu)體成員傳入std::tie,從而實(shí)現(xiàn)結(jié)構(gòu)體的比較。

struct S {
    int n;
    std::string s;
    float d;
    bool operator< (const S& rhs) const
    {
        // 比較 n 與 rhs.n,
        // 然后為 s 與 rhs.s,
        // 然后為 d 與 rhs.d
        return std::tie(n, s, d) < std::tie(rhs.n, rhs.s, rhs.d);
        //注:由于tie返回的是一個(gè) tuple,tuple的實(shí)現(xiàn)已經(jīng)重載了operator< ,因此可以利用tuple的operator< ,進(jìn)而實(shí)現(xiàn)結(jié)構(gòu)體S的operator< 。
    }
};

具體示例

#include < iostream >
#include < set >
#include < string >
#include < tuple >
using namespace std;

struct S {
    int n;
    string s;
    float d;
    bool operator< (const S& rhs) const {
        // 比較 n 與 rhs.n,
        // 然后為 s 與 rhs.s,
        // 然后為 d 與 rhs.d
        return tie(n, s, d) < tie(rhs.n, rhs.s, rhs.d);
    }
};

int main() {
    set< S > set_of_s;

    S value1{42, "Test1", 3.14};
    S value2{23, "Test2", 3.14};
    set< S >::iterator iter;
    bool result;

    /************解包**********/
    tie(iter, result) = set_of_s.insert(value1);
    if (result) cout < < "Value1 was inserted successfullyn";

    tie(std::ignore, result) = set_of_s.insert(
        value2);  // 使用std::ignore忽略insert的返回pair中的第一個(gè)元素
    if (result) cout < < "Value2 was inserted successfullyn";

    /***********結(jié)構(gòu)體比較**********/
    bool r = value1 < value2;
    cout < < "value1 < value2 : " < < r < < endl;

    /***********批量賦值**********/
    tuple< string, double, int > tup("idoit", 98.8, 1);
    string name;
    double score;
    int rank;

    tie(name, score, rank) = tup;
    cout < < name < < " " < < score < < " " < < rank < < endl;

    return 0;
}

輸出結(jié)果:

Value1 was inserted successfully
Value2 was inserted successfully
value1 < value2 : 0
idoit 98.8 1
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8505

    瀏覽量

    145978
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6931
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++函數(shù)virtual詳解

    C++ 中的虛函數(shù)用于解決動(dòng)態(tài)多態(tài)問(wèn)題,虛函數(shù)作用是允許在派生類(lèi)中重新定義與積累同名的函數(shù),并且可以通過(guò)基類(lèi)指針或引用來(lái)訪(fǎng)問(wèn)基類(lèi)和派生類(lèi)中
    發(fā)表于 09-07 11:27 ?2743次閱讀

    c++中冒號(hào)(:)和雙冒號(hào)(::)的用法

    ()——————————————————————————————————————VC中如下::是C++里的“作用域分解運(yùn)算符”。比如聲明了一個(gè)類(lèi)A,類(lèi)A里聲明了一個(gè)成員函數(shù)voidf(),但沒(méi)有在類(lèi)的聲明里給出f的定義,那么在類(lèi)
    發(fā)表于 10-18 10:08

    C/C++回調(diào)函數(shù)

    C/C++回調(diào)函數(shù)首先看一下回調(diào)函數(shù)的官方解釋?zhuān)夯卣{(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的
    發(fā)表于 02-11 15:25

    嵌入式-C++函數(shù)的重載

    一、什么是函數(shù)的重載 兩個(gè)以上的函數(shù),具有相同的函數(shù)名,通過(guò)參數(shù)的類(lèi)型和參數(shù)的個(gè)數(shù)不同。編譯器自行匹配,自動(dòng)確定調(diào)用哪一個(gè)函數(shù) 二、函數(shù)重載
    發(fā)表于 06-28 13:54

    如何在中斷C函數(shù)中調(diào)用C++

    之前,我們?cè)趩纹瑱C(jī)程序開(kāi)發(fā)時(shí)都會(huì)面對(duì)中斷函數(shù)。眾所周知的,這個(gè)中斷函數(shù)肯定是要用C函數(shù)來(lái)定義的。我在用C++進(jìn)行程序開(kāi)發(fā)的時(shí)候就發(fā)現(xiàn)了一個(gè)需
    發(fā)表于 05-09 18:17 ?0次下載
    如何在中斷<b class='flag-5'>C</b><b class='flag-5'>函數(shù)</b>中調(diào)用<b class='flag-5'>C++</b>

    C語(yǔ)言和C++的特點(diǎn)與用法詳細(xì)說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言和C++的特點(diǎn)與用法詳細(xì)說(shuō)明。
    的頭像 發(fā)表于 12-26 10:58 ?4240次閱讀

    EE-128:C++中的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)

    EE-128:C++中的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C++</b>中的DSP:從<b class='flag-5'>C++</b>調(diào)用匯編類(lèi)成員<b class='flag-5'>函數(shù)</b>

    C++中如何用虛函數(shù)實(shí)現(xiàn)多態(tài)

    01 — C++函數(shù)探索 C++是一門(mén)面向?qū)ο笳Z(yǔ)言,在C++里運(yùn)行時(shí)多態(tài)是由虛函數(shù)和純虛函數(shù)實(shí)
    的頭像 發(fā)表于 09-29 14:18 ?1618次閱讀

    C++ C語(yǔ)言函數(shù)查詢(xún)電子版下載

    C++ C語(yǔ)言函數(shù)查詢(xún)電子版下載
    發(fā)表于 01-18 10:15 ?0次下載

    深度解析C++中的虛函數(shù)

    函數(shù)作為C++的重要特性,讓人又愛(ài)又怕,愛(ài)它功能強(qiáng)大,但又怕駕馭不好,讓它反咬一口,今天我們用CPU的角度,撕掉語(yǔ)法的偽裝,重新認(rèn)識(shí)一下虛函數(shù)。 虛函數(shù)
    的頭像 發(fā)表于 02-15 11:14 ?738次閱讀
    深度解析<b class='flag-5'>C++</b>中的虛<b class='flag-5'>函數(shù)</b>

    C++中有函數(shù)指針還需要std::function嘛

    C/C++中可以使用指針指向一段代碼,這個(gè)指針就叫函數(shù)指針,假設(shè)有這樣一段代碼:
    的頭像 發(fā)表于 02-15 14:13 ?433次閱讀
    <b class='flag-5'>C++</b>中有<b class='flag-5'>函數(shù)</b>指針還需要<b class='flag-5'>std</b>::function嘛

    C++基礎(chǔ)知識(shí)之函數(shù)1

    函數(shù)C++ 中的一個(gè)重要概念,它可以讓我們將一段代碼封裝起來(lái),然后在需要的時(shí)候調(diào)用它。C++ 中的函數(shù)有以下幾個(gè)特點(diǎn): * 函數(shù)
    的頭像 發(fā)表于 04-03 10:34 ?459次閱讀

    ?數(shù)組和C++ std::array詳解

    std::array是C++容器庫(kù)提供的一個(gè)固定大小數(shù)組的容器。其與內(nèi)置的數(shù)組相比,是一種更安全、更容易使用的數(shù)組類(lèi)型。
    的頭像 發(fā)表于 07-19 11:02 ?830次閱讀
    ?數(shù)組和<b class='flag-5'>C++</b> <b class='flag-5'>std</b>::array詳解

    動(dòng)態(tài)數(shù)組和C++ std::vector詳解

    std::vector是C++的默認(rèn)動(dòng)態(tài)數(shù)組,其與array最大的區(qū)別在于vector的數(shù)組是動(dòng)態(tài)的,即其大小可以在運(yùn)行時(shí)更改。std::vector是封裝動(dòng)態(tài)數(shù)組的順序容器,且該容器中元素的存取是連續(xù)的。
    的頭像 發(fā)表于 07-19 11:07 ?871次閱讀

    ostream在c++中的用法

    ostream 是 C++ 標(biāo)準(zhǔn)庫(kù)中一個(gè)非常重要的類(lèi),它位于 頭文件中(實(shí)際上,更常見(jiàn)的是通過(guò)包含 頭文件來(lái)間接包含 ,因?yàn)?包含了 和 )。 ostream 類(lèi)及其派生類(lèi)(如 std::cout
    的頭像 發(fā)表于 09-20 15:11 ?93次閱讀