C++11:tuple元組

来源:https://www.cnblogs.com/crossoverpptx/archive/2022/12/26/17005303.html
-Advertisement-
Play Games

C++11 標準新引入了一種類模板,命名為 tuple(元組)。tuple 最大的特點是:實例化的對象可以存儲任意數量、任意類型的數據。 tuple 的應用場景很廣泛,例如當需要存儲多個不同類型的元素時,可以使用 tuple;當函數需要返回多個數據時,可以將這些數據存儲在 tuple 中,函數只需返 ...


C++11 標準新引入了一種類模板,命名為 tuple(元組)。tuple 最大的特點是:實例化的對象可以存儲任意數量、任意類型的數據。

tuple 的應用場景很廣泛,例如當需要存儲多個不同類型的元素時,可以使用 tuple;當函數需要返回多個數據時,可以將這些數據存儲在 tuple 中,函數只需返回一個 tuple 對象即可。

1. tuple對象的創建

tuple 本質是一個以可變模板參數定義的類模板,它定義在 頭文件並位於 std 命名空間中。因此要想使用 tuple 類模板,程式中需要首先引入以下代碼:

#include <tuple>
using std::tuple;

實例化 tuple 模板類對象常用的方法有兩種,一種是藉助該類的構造函數,另一種是藉助 make_tuple() 函數。

1.1 類的構造函數

tuple 模板類提供有很多構造函數,包括:

1) 預設構造函數
constexpr tuple();
2) 拷貝構造函數
tuple (const tuple& tpl);
3) 移動構造函數
tuple (tuple&& tpl);
4) 隱式類型轉換構造函數
template <class... UTypes>
    tuple (const tuple<UTypes...>& tpl); //左值方式
template <class... UTypes>
    tuple (tuple<UTypes...>&& tpl);      //右值方式
5) 支持初始化列表的構造函數
explicit tuple (const Types&... elems);  //左值方式
template <class... UTypes>
    explicit tuple (UTypes&&... elems);  //右值方式
6) 將pair對象轉換為tuple對象
template <class U1, class U2>
    tuple (const pair<U1,U2>& pr);       //左值方式
template <class U1, class U2>
    tuple (pair<U1,U2>&& pr);            //右值方式

舉個例子:

#include <iostream>     // std::cout
#include <tuple>        // std::tuple
using std::tuple;

int main()
{
    std::tuple<int, char> first;                             // 1)   first{}
    std::tuple<int, char> second(first);                     // 2)   second{}
    std::tuple<int, char> third(std::make_tuple(20, 'b'));   // 3)   third{20,'b'}
    std::tuple<long, char> fourth(third);                    // 4)的左值方式, fourth{20,'b'}
    std::tuple<int, char> fifth(10, 'a');                    // 5)的右值方式, fifth{10.'a'}
    std::tuple<int, char> sixth(std::make_pair(30, 'c'));    // 6)的右值方式, sixth{30,''c}
    return 0;
}

1.2 make_tuple()函數

上面程式中,我們已經用到了 make_tuple() 函數,它以模板的形式定義在 頭文件中,功能是創建一個 tuple 右值對象(或者臨時對象)。

對於 make_tuple() 函數創建了 tuple 對象,我們可以上面程式中那樣作為移動構造函數的參數,也可以這樣用:

auto first = std::make_tuple (10,'a');   // tuple < int, char >
const int a = 0; int b[3];
auto second = std::make_tuple (a,b);     // tuple < int, int* >

程式中分別創建了 first 和 second 兩個 tuple 對象,它們的類型可以直接用 auto 表示。

2. tuple常用函數

為了方便在實際開發中使用 tuple 對象,tupe 模板類提供了一個功能實用的成員函數, 頭文件中也提供了一些和操作 tuple 對象相關的函數模板和類模板,如下表所示:

函數或類模板 描 述
tup1.swap(tup2) swap(tup1, tup2) tup1 和 tup2 表示類型相同的兩個 tuple 對象,tuple 模板類中定義有一個 swap() 成員函數, 頭文件還提供了一個同名的 swap() 全局函數。 swap() 函數的功能是交換兩個 tuple 對象存儲的內容。
get(tup) tup 表示某個 tuple 對象,num 是一個整數,get() 是 頭文件提供的全局函數,功能是返回 tup 對象中第 num+1 個元素。
tuple_size::value tuple_size 是定義在 頭文件的類模板,它只有一個成員變數 value,功能是獲取某個 tuple 對象中元素的個數,type 為該tuple 對象的類型。
tuple_element<I, type>::type tuple_element 是定義在 頭文件的類模板,它只有一個成員變數 type,功能是獲取某個 tuple 對象第 I+1 個元素的類型。
forward_as_tuple<args...> args... 表示 tuple 對象存儲的多個元素,該函數的功能是創建一個 tuple 對象,內部存儲的 args... 元素都是右值引用形式的。
tie(args...) = tup tup 表示某個 tuple 對象,tie() 是 頭文件提供的,功能是將 tup 記憶體儲的元素逐一賦值給 args... 指定的左值變數。
tuple_cat(args...) args... 表示多個 tuple 對象,該函數是 頭文件提供的,功能是創建一個 tuple 對象,此對象包含 args... 指定的所有 tuple 對象內的元素。

tuple 模板類對賦值運算符 = 進行了重載,使得同類型的 tuple 對象可以直接賦值。此外,tuple 模板類還重載了 ==、!=、<、>、>=、<= 這幾個比較運算符,同類型的 tuple 對象可以相互比較(逐個比較各個元素)。

以下程式演示了上表中一部分函數模板和類模板的功能:

#include <iostream>
#include <tuple>

int main()
{
    int size;
    //創建一個 tuple 對象存儲 10 和 'x'
    std::tuple<int, char> mytuple(10, 'x');
    //計算 mytuple 存儲元素的個數
    size = std::tuple_size<decltype(mytuple)>::value;
    //輸出 mytuple 中存儲的元素
    std::cout << std::get<0>(mytuple) << " " << std::get<1>(mytuple) << std::endl;
    //修改指定的元素
    std::get<0>(mytuple) = 100;
    std::cout << std::get<0>(mytuple) << std::endl;
    //使用 makde_tuple() 創建一個 tuple 對象
    auto bar = std::make_tuple("test", 3.1, 14);
    //拆解 bar 對象,分別賦值給 mystr、mydou、myint
    const char* mystr = nullptr;
    double mydou;
    int myint;
    //使用 tie() 時,如果不想接受某個元素的值,實參可以用 std::ignore 代替
    std::tie(mystr, mydou, myint) = bar;
    //std::tie(std::ignore, std::ignore, myint) = bar;  //只接收第 3 個整形值
    //將 mytuple 和 bar 中的元素整合到 1 個 tuple 對象中
    auto mycat = std::tuple_cat(mytuple, bar);
    size = std::tuple_size<decltype(mycat)>::value;
    std::cout << size << std::endl;
    return 0;
}

程式執行結果為:

10 x
100
5

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 含義 Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社區發展的一種機制。目前Cookie已經成為標準,所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。 由於HTTP是一種無狀態的協議,伺服器單從網路連接上無從知道客戶身份,怎麼辦呢 ...
  • 哈嘍兄弟們,今天咱們來實現用Python來批量生成請假條,這回既學了東西又做了事情,兩不誤~ 本文就將基於一個真實的辦公案例進行講解如何提取Excel內容並創建Word 主要將涉及以下三個知識點 openpyxl 讀取 Excel 文件 python-docx 寫入 Word 文件 python-d ...
  • 1. 頁面傳值 1.1 父頁面向子頁面傳值 父頁面: /pages/xx/xxx?id=1 子頁面 // option就可以接收到父頁面傳來的值 onLoad:function(option){ } 1.2 子父頁面 子頁面 var pages = getCurrentPages() var pre ...
  • 摘要:盤點 Python 中字元串的幾個常用操作,對新手極度的友好。 本文分享自華為雲社區《盤點 Python 中字元串的常用操作,對新手極度友好》,作者:TT-千葉 。 在 Python 中字元串的表達方式有四種 一對單引號一對雙引號一對三個單引號一對三個雙引號a = ‘abc’b= “abc”c ...
  • 時光荏苒,這周日就是元旦了,我也把年終總結提上了日程。 前言 今年的年終總結我打算多寫幾篇,每篇瞄準一個方向,寫一些對大家有幫助、有啟發的內容。 初步的想法會整理三篇: 第一篇分享求職面試的經驗 第二篇分享接私活的經驗 第三篇分享一下在北京買房的經驗,作為過來人和你嘮嘮要不要在一線城市買房。 整理這 ...
  • 前段時間收到線上一些列告警,內容是CMSGC太頻繁。那接下來這篇文章我會告訴你:什麼是CMSGC太頻繁;整個排查過程與你分享;以及一些規避手段。 ...
  • 想用python腳本創建一個耦合coupling關係,需要定義control piont和被控制的surfaces.兩者都可以先分別歸入到set 和surface里,最後用set和surface作為coupling創建時的參數。 ...
  • String 類 定義 String 類代表字元串。Java 程式中的所有字元串字面值(如 "abc" )都作為此類的實例實現。我們可以將字元串看作是String, 但是嚴格意義上來說, String還是一個類,只是比較特殊罷了 特殊性 String 類型的變數可以引用地址 String 類型的變數 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...