精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++多元組Tuple使用方法?你熟悉嗎?快來看看吧

開發 后端
tuple 是類似于pair的模板。每個pair的成員類型都不相同,但每個pair都恰好有兩個成員。不同tuole類型的也不相同,但一個tuple可以有任意數量的成員。每個確定的tuple類型的成員數目是固定的,但一個tuple類型的成員數目可以與另一個tuple類型不同。

[[350276]]

前言

tuple 是類似于pair的模板。每個pair的成員類型都不相同,但每個pair都恰好有兩個成員。不同tuole類型的也不相同,但一個tuple可以有任意數量的成員。每個確定的tuple類型的成員數目是固定的,但一個tuple類型的成員數目可以與另一個tuple類型不同。

當我們希望將一些數據組合成單一對象,但又不想麻煩地定義一個新數據來表示這些數據時,tuple是非常有用的。

例如我們可以構造一個tuple 

  1. tuple<const char*, int>tp = make_tuple(sendPack,nSendSize); 

這個tuple等價于一個結構體

  1. struct A 
  2.   char* p; 
  3.   int len; 
  4. }; 

用tupletp就可以不用創建這個結構體了,而作用是一樣的,是不是更簡潔直觀了

還有一種方法也可以創建元組,用std::tie,它會創建一個元組的左值引用。

  1. auto tp = return std::tie(1, "aa", 2); 

tp的類型實際是:

  1. std::tuple<int&,string&, int&> 

tuple初印象

tuple支持如下的操作

  1. std::tuple<T1, T2, ...TN> t;            //創建一個空的tuple對象(使用默認構造),它對應的元素分別是T1和T2...Tn類型,采用值初始化。 
  2. std::tuple<T1, T2, ...TN> t2(v1, v2, ... vn);    //創建一個tuple對象,它的元素分別是T1和T2 ...Tn類型; 每個成員用對應的vi進行初始化 
  3. std::tuple<T1&> t3(ref&); // tuple的元素類型可以是一個引用 

像pair一樣也可以通過make_tuple進行創建一個tuple對象,tuple的類型從初始值的類型推斷

  1. std::make_tuple(v1, v2);  

返回t的第i個數據成員的引用:如果t是一個左值,結果是一個左值引用;否則,結果是一個右值引用。此外tuple的所有成員都是pulic的。

  1. get<i>(t) 

我們可以將tuple看作一個“快速而隨意”的數據結構。

定義和初始化tuple

當我們定義一個std::tuple時,需要指出每個成員的類型。

  1. tuple<size_t,size_t,size_t> threeD; //三個成員都被設置為0 
  2.  
  3. tuple<string,vector<doble>,int ,list<int>> someVal("constans",{3.14,2.718},42,{0,1,2,3,4,5}); 

當我們創建一個std::tuple對象時,可以使用tuple的默認構造函數,它會對每個成員進行值初始化;也可以向上面someVal初始化一樣,為每個成員提供一個初始值,此時的構造函數是explicit的,因此必須使用直接初始化方法。

  1. tuple<size_t,size_t,size_t> htreeD = {1,2,3}; 
  2. tuple<size_t,size_t,size_t> htreeD(1,2,3); 

類似make_pair函數,標準庫定義了make_tuple函數,我們還可以使用它來生成std::tuple對象。

  1. auto item = mak_tuple("0-999-78345-x",3,20.00); 

類似make_pair,make_tuple函數使用初始值的類型來推斷tuple的類型。在上面示例中,item是一個tuple,類型為tuple .

訪問tuple的成員

一個pair總是有兩個成員,這樣標準庫就可以為他們命名(first和second),但是這種命名方法不適用于tuple,因為一個tuple的類型的成員數目是沒有限制的。因為,tuple的成員都是未命名的。要訪問一個tuple的成員,就要使用一個名為get的標準庫函數模板。為了使用get,我們必須指定一個顯示模板實參,它指出我們想要訪問第幾個成員。我們傳遞給get一個tuple對象,它返回指定成員的引用。

  1. auto book  = get<0>(iterm); //返回iterm的第一個成員 
  2. auto cnt  = get<0>(iterm); //返回iterm的第二個成員 
  3. auto price  = get<0>(iterm)/cnt; //返回iterm的第三個成員 

尖括號中的值必須是一個整型常量表達式,與平時一樣,我們從0開始計數,意味著get<0>是第一個成員。

如果不知道tuple準確的類型細節信息,可以用兩個輔助類模板查詢tuole的成員的數量和類型:

1.一個類模板,可以通過一個tuple類型初始化,它有一個名為value的public constexpr static數據類型,類型為size_t,表示給定tuple類型中成員數量

  1. tuple_element<i,tupleType>::type 

2.一個類模板,可以通過一個整型常量和一個tuple類型來初始化。它有一個名為type的public成員,表示給定tuple類型中指定的類型

  1. tuple_size<tupleType>::value 

通過這兩個類模板我們可以獲得我們需要的tuple變量的成員數量和類型

  1. typedef decltype(item) trans;//trans是item的類型 
  2.  
  3. size_t sz = tuple_size< trans>::value;//返回trans類型對象中成員的數量 
  4.  
  5. tuple_element<1,trans>::type cnt ; // cnt 為 item第二個成員變量類型  int型 
  6.  
  7. cnt = get<1>(item); 

為了使用tuple_size或tuple_element,我們需要知道一個tuple對象的類型。與往常一樣,確定一個對象的類型的最簡單的方法就是使用decltype,在typedef decltype(item) trans;中,我們使用decltype來為item定義一個類型別名,用它來實例化這兩個模板。

tuple_size有一個名為value的public static數據成員,它表示給定tuple中成員的數量。 tuple_element模板除了一個tuple類型外,還接受一個索引值。它有一個名為type的public類型成員,表示給定tuple類型中指定成員類型。類似get,tuple_element所使用的索引也是從0開始計數的。

std::tuple的關系和相等運算符的行為類似容器的對應操作。這些運算符逐對比較左側tuple和右側tuple的成員。只有兩個tuple具有相同數量的成員時,我們才可以比較它們。而且,為了使用tuple的相等或不等運算符,對每對成員使用==運算符必須都是合法的;為了使用關系運算符,對每對成員使用 < 必須都是合法的。

關系和相等運算符:當兩個tuole具有相同數量的成員且成員對應相等時,兩個才tuple相同。

  1. tuple<string,string> duo("1","2"); 
  2. tuple<size_t,size_t> twoD(1,2); 
  3.  
  4. bool b = (duo == twoD); // 錯誤,不能比較size_t 和 string 
  5.  
  6. tuple<size_t,size_t,size_t> threeD(1,2,3); 
  7.  b = (duo == threeD); // 錯誤,成員數量不同 
  8. tuple<size_t,size_t> origin(0,0); 
  9.  b = (origin < twoD); // 正確:b為true 

由于tuple定義了<和==運算符,我們可以將tuple序列傳遞給算法,并且可以在無序容器中將tuple作為關鍵字類型。

利用tie進行解包元素的值

如同pair一樣也是可以通過tie進行解包tuple的各個元素的值。如下tuple對象有4個元素,通過tie解包將會把這4個元素的值分別賦值給tie提供的4個變量中。

  1. int main(int argc, char **argv) { 
  2.     std::tuple<std::string, int, std::string, int> tp; 
  3.     tp = std::make_tuple("Sven", 25, "Shanghai", 21); 
  4.     // 定義接收變量 
  5.     std::string name
  6.     std::string addr; 
  7.     int ages; 
  8.     int areaCode; 
  9.   
  10.     std::tie(name, ages, addr, areaCode) = tp; 
  11.     std::cout << "Output: " << '\n'
  12.     std::cout << "name: " << name <<", "
  13.     std::cout << "addr: " << addr << ", "
  14.     std::cout << "ages: " << ages << ", "
  15.     std::cout << "areaCode: " << areaCode << '\n'
  16.     return 0; 

輸出結果:

name: Sven, addr: Shanghai, ages: 25, areaCode: 21

但有時候tuple包含的多個元素時只需要其中的一個或兩個元素,如此可以通過std::ignore進行變量占位,這樣將會忽略提取對應的元素。可以修改上述例程:

  1. std::tie(name, ages, std::ignore, std::ignore) = tp; 

std::tuple中元素是被緊密地存儲的(位于連續的內存區域),而不是鏈式結構。

如何遍歷tuple成員

N表示tuple中的第N個元素

  1. #include <iostream> 
  2. #include <tuple> 
  3. #include <string> 
  4.   
  5. using namespace std; 
  6.   
  7. template<typename Tuple, int N = std::tuple_size<Tuple>::value> 
  8. struct Printer 
  9.   static void log(Tuple& t) { 
  10.     Printer<Tuple, N - 1>::log(t); 
  11.   
  12.     using type = typename std::tuple_element<N - 1, Tuple>::type; 
  13.     std::string ts = typeid(type).name(); 
  14.     type& v = std::get<N - 1>(t); 
  15.   
  16.     std::cout << ts << ":" << v << std::endl; 
  17.   } 
  18. }; 
  19.   
  20. template<typename Tuple> 
  21. struct Printer<Tuple,  1> 
  22.   static void log(Tuple& t) { 
  23.     using type = typename std::tuple_element<0, Tuple>::type; 
  24.     std::string ts = typeid(type).name(); 
  25.     type& v = std::get<0>(t); 
  26.   
  27.     std::cout << ts << ":" << v << std::endl; 
  28.   } 
  29. }; 
  30.   
  31. int main() { 
  32.   std::tuple<int, bool, string> t = std::forward_as_tuple(11, true"ok"); 
  33.   Printer<std::tuple<int, bool, string>>::log(t); 
  34.   
  35.   return 1; 

tuple做返回相關作用

使用tuple返回多個值,tuple的一個常見用途就是從一個函數返回多個值。

返回tuple的函數

  1. tuple<int, string> fun() 
  2.         // 用make_tuple來構造一個tuple 
  3. return make_tuple(1024, "tuple"'3'); 

使用函數返回的tuple

  1. auto tp = fun(); 
  2. auto id      = std::get<0>(tp); 
  3.  
  4. auto name= std::get<1>(tp); 
  5.  
  6. auto num  = std::get<2>(tp); 

 

 本文轉載自微信公眾號「羽林君」,可以通過以下二維碼關注。轉載本文請聯系羽林君公眾號。

 

責任編輯:武曉燕 來源: 良知猶存
相關推薦

2021-04-19 09:23:26

數字化

2018-03-12 10:35:01

LinuxBash快捷鍵

2017-11-24 08:00:55

前端JSCSS

2025-01-13 00:00:05

2020-06-08 15:06:33

Pandas可視化數據

2025-01-13 07:10:00

前端開發

2018-01-19 10:37:00

2020-04-16 09:35:53

數據科學機器學習數據分析

2010-02-02 09:32:32

C++ typedef

2020-08-04 07:02:00

TCPIP算法

2010-01-26 17:35:09

C++棧

2024-06-03 00:00:06

高性能數據傳輸應用程序

2010-02-02 09:49:02

C++模板

2010-01-25 14:10:21

C++堆棧

2018-05-02 15:41:27

JavaScript人臉檢測圖像識別

2018-03-06 09:54:48

數據庫備份恢復

2022-11-28 07:32:46

迭代器remove數據庫

2011-07-13 11:34:58

CC++時間函數

2019-12-11 16:36:09

編程語言排行榜Python

2020-12-25 10:35:42

編程語言C語言Java
點贊
收藏

51CTO技術棧公眾號

91av福利视频| 国产欧美一区二区三区在线看蜜臀 | 久久久久久久国产精品毛片| 日韩av网站在线免费观看| 在线视频一区二区免费| 久久久无码中文字幕久...| 亚洲男女视频在线观看| 美女视频一区免费观看| 操日韩av在线电影| 青青草视频播放| 亚洲成人精品综合在线| 偷窥少妇高潮呻吟av久久免费| 看高清中日韩色视频| 国产精品玖玖玖| 午夜在线一区| 久久99精品久久久久久琪琪 | 美国十次av导航亚洲入口| 日本精品免费观看高清观看| 中文字幕第50页| 精品三级久久久久久久电影聊斋| 精品一二三四区| 欧美洲成人男女午夜视频| 小泽玛利亚一区| 亚洲精品进入| 精品美女一区二区三区| 欧美激情第3页| 成人欧美一区二区三区的电影| 综合久久综合久久| 色狠狠久久av五月综合| 少妇人妻偷人精品一区二区 | 疯狂蹂躏欧美一区二区精品| 国产又粗又硬又长| av女优在线| 国产亚洲视频系列| 狠狠色伊人亚洲综合网站色| 国产黄色大片网站| 精品在线观看视频| 国产精品午夜视频| 成年人视频免费| 新67194成人永久网站| 国产69精品久久久久99| 超碰在线国产97| 国产精品久久久久无码av| 伊人精品在线观看| 亚洲а∨天堂久久精品2021| 亚洲三级性片| 亚洲精品中文字幕有码专区| 成人影视免费观看| 色婷婷综合久久久久久| 亚洲国产99精品国自产| 白嫩情侣偷拍呻吟刺激 | 蜜桃av色综合| 五月婷婷六月丁香综合| 99久久国产综合色|国产精品| 成人羞羞视频免费| 国产91免费在线观看| 国产91精品精华液一区二区三区 | 久久狠狠久久| 精品国产91洋老外米糕| 永久免费未满蜜桃| 欧美爱爱网站| 亚洲欧美国产va在线影院| 人妻熟女aⅴ一区二区三区汇编| 色婷婷久久久| 在线播放国产一区二区三区| 美女100%露胸无遮挡| 日韩理论电影大全| 久久国产精品久久久久久久久久| 男女做暖暖视频| 国产真实久久| 性色av一区二区三区| 国产成人在线免费视频| 久久欧美肥婆一二区| 国产精品久久久久久亚洲调教| 在线播放国产一区| 国产美女久久久久| 国产亚洲情侣一区二区无| 四虎影视在线播放| 亚洲国产高清aⅴ视频| 亚洲自拍偷拍一区二区三区| 欧美xxxx性xxxxx高清| 高跟丝袜一区二区三区| 国产又黄又猛又粗| 日韩一区网站| 亚洲欧美一区二区精品久久久| 91无套直看片红桃在线观看| 欧美国产免费| 欧洲成人免费视频| 国产又大又长又粗| 处破女av一区二区| 日韩hmxxxx| 亚洲七七久久综合桃花剧情介绍| 精品美女久久久久久免费| 一区二区三区韩国| 超碰精品在线| 中文字幕无线精品亚洲乱码一区| 91视频综合网| 日日夜夜精品视频天天综合网| 91精品中文在线| 免费在线性爱视频| 一区二区三区在线免费播放| 五月婷婷狠狠操| 成人资源在线| 精品国内亚洲在观看18黄 | 国产盗摄在线观看| 精品日本高清在线播放| 久久久久久久高清| 亚洲va久久久噜噜噜久久| 久久精品国产亚洲7777| 久久久久久不卡| 国产成a人亚洲精| 亚洲国产欧美日韩| 国产在线看片免费视频在线观看| 欧美日韩国产a| 老司机福利av| 精品成人久久| 成人乱人伦精品视频在线观看| 亚洲aⅴ乱码精品成人区| 亚洲欧美偷拍三级| 日韩中文字幕a| 在线日本制服中文欧美| 欧美精品videos性欧美| 一级特黄色大片| 国产亚洲欧美激情| 免费看又黄又无码的网站| 日韩有吗在线观看| 欧美成人午夜激情在线| 最近中文字幕在线观看视频| 久久综合资源网| 黄色一级片播放| 成人另类视频| 欧美激情视频在线免费观看 欧美视频免费一| 欧美黄色一级大片| 91香蕉视频mp4| 全黄性性激高免费视频| 午夜日韩影院| 欧美日韩国产成人高清视频| 国产精品人妻一区二区三区| 国产精品毛片大码女人| 国产wwwxx| 伊人久久大香线蕉综合网站| 66m—66摸成人免费视频| 好吊色在线观看| 亚洲国产综合人成综合网站| 亚洲v在线观看| 欧美日韩视频一区二区三区| 亚洲最大福利视频| 最新日本在线观看| 日韩欧美一区二区久久婷婷| 青青草成人免费| 国产精品一二三区| 久久久久久av无码免费网站下载| 我要色综合中文字幕| 欧美猛少妇色xxxxx| 亚洲精品一区二区口爆| 香蕉加勒比综合久久| 中文字幕影片免费在线观看| 亚洲精品社区| 欧美一区二区在线视频观看| 色天使综合视频| 色婷婷av一区二区三区在线观看 | 亚洲人成午夜免电影费观看| 亚洲精品在线不卡| 欧美成人一区二区视频| 国产精品久久久久久久久免费相片 | 欧美人一级淫片a免费播放| 国产亚洲一本大道中文在线| 亚洲一区日韩精品| 欧美久久综合| 精品国产乱码久久久久久蜜柚 | 粉嫩av四季av绯色av第一区| 爱啪啪综合导航| 亚洲人成电影在线观看天堂色| 国产亚洲久一区二区| 18成人在线观看| 欧类av怡春院| 蜜臀久久久久久久| 日本福利视频在线观看| 日本成人中文| 国产精品网红直播| 女囚岛在线观看| 亚洲欧洲第一视频| 国产剧情精品在线| 亚洲一级片在线观看| 国产熟妇搡bbbb搡bbbb| 久久99九九99精品| 国产人妻777人伦精品hd| 欧美伦理在线视频| 亚洲影院在线看| 亚洲欧美小说色综合小说一区| 色偷偷偷综合中文字幕;dd| 国产精品毛片一区二区在线看舒淇 | 日韩一级二级| 欧美激情视频免费观看| 国产一区二区三区福利| 日韩精品一区二| 精人妻无码一区二区三区| 亚洲精品视频在线观看网站| 亚洲第一成人网站| 国产精品18久久久久久久久| 国产成人无码av在线播放dvd| 久久久久久美女精品| 久久精品一二三区| 精品视频一区二区三区| 日本精品久久久久影院| 2021国产在线| 色偷偷888欧美精品久久久| 三级av在线播放| 日韩一级高清毛片| 久草视频在线免费| 亚洲成av人片在www色猫咪| 久久久久久成人网| 91丨porny丨在线| 午夜啪啪小视频| 日韩制服丝袜av| xxxx18hd亚洲hd捆绑| 亚洲天堂一区二区三区四区| 日本视频一区在线观看| 欧美久久香蕉| a级国产乱理论片在线观看99| 不卡亚洲精品| 日本中文字幕成人| 免费成人在线电影| 欧美国产日韩视频| av片哪里在线观看| 色爱精品视频一区| a黄色在线观看| 国产香蕉精品视频一区二区三区| 天堂网在线播放| 精品三级在线看| www.天堂在线| 欧美一区二区在线免费播放| 一本色道久久综合亚洲| 欧美性极品少妇| 国产情侣呻吟对白高潮| 色欧美片视频在线观看| 欧美a视频在线观看| 色先锋aa成人| 亚洲 日本 欧美 中文幕| 午夜av一区二区| 久久久午夜影院| 欧美日韩精品二区| av大全在线观看| 一本色道综合亚洲| 精品免费囯产一区二区三区 | 欧美成人专区| 精品国产乱码久久久久久郑州公司 | 强乱中文字幕av一区乱码| 亚洲日本一区二区| 国产女人被狂躁到高潮小说| 一区二区视频在线| 久久久全国免费视频| 亚洲图片欧美一区| 成人精品免费在线观看| 色呦呦一区二区三区| 国产精品成人久久久| 欧美日韩一区二区不卡| 一二三区中文字幕| 欧美一区二区三区在线看| a视频免费在线观看| 精品国产百合女同互慰| 天堂av网在线| 在线一区二区日韩| 国产黄色小视频在线| 欧美激情18p| 自拍在线观看| 国产精品爽爽爽| 精品国产一区二区三区2021| 高清免费日韩| 天堂综合网久久| 亚洲三区四区| 亚洲视频日本| 亚洲国产精品毛片av不卡在线| 麻豆一区二区三| japan高清日本乱xxxxx| 成人免费的视频| 337人体粉嫩噜噜噜| 亚洲三级免费观看| 四虎永久在线精品| 欧美视频在线播放| 亚洲精品911| 国产一区二区三区视频 | 日本欧美一级片| 精品福利在线| 国产九色精品| 日韩欧美网站| 国产精品国产亚洲精品看不卡| 日日噜噜夜夜狠狠视频欧美人| 青青草原国产在线视频| 成人精品电影在线观看| 色婷婷国产精品免| 亚洲精品乱码久久久久| 国产精品久久久久久久久久精爆| 欧美区一区二区三区| 欧美少妇bbw| 日韩在线观看免费高清| 日本在线影院| 5g影院天天爽成人免费下载| 亚洲尤物av| 免费视频爱爱太爽了| 久久99热这里只有精品| av无码av天天av天天爽| 亚洲男人天堂av网| 免费观看日批视频| 亚洲精品一区二区三区影院| 69久久精品| 欧美一区亚洲一区| 亚洲精品一区二区三区中文字幕| 无码免费一区二区三区免费播放| 日韩视频一区| 亚洲天堂小视频| 国产精品久久福利| 欧美福利视频一区二区| 欧美一级欧美三级在线观看 | 国产精品久久久久一区| 五月天婷婷久久| 日韩美女一区二区三区四区| 成年人在线观看视频| 琪琪第一精品导航| 都市激情久久| 香港三级日本三级a视频| 久久精品国内一区二区三区| 国产特黄级aaaaa片免| 亚洲影视资源网| 国产视频手机在线| 中文字幕亚洲欧美在线| 国产另类xxxxhd高清| 精品免费一区二区三区蜜桃| 国内精品嫩模av私拍在线观看| 久久成年人网站| 中文字幕日韩av资源站| 人妻中文字幕一区二区三区| 亚洲人成电影网站色| 欧美大胆成人| 欧美日本国产精品| 亚洲欧美日本国产专区一区| 人妻av一区二区| 午夜视频一区二区| 色偷偷在线观看| 91av视频在线| 亚洲综合福利| 日本黄网站免费| 国产午夜精品理论片a级大结局| 4438国产精品一区二区| 亚洲精品小视频在线观看| 国产在线观看www| 久久久人人爽| 日韩精品乱码av一区二区| 无码 人妻 在线 视频| 在线亚洲一区二区| 91看片在线观看| 91精品视频播放| 国产精品v亚洲精品v日韩精品| 亚洲911精品成人18网站| 一区二区三区国产豹纹内裤在线 | 99久久这里有精品| 日韩不卡一二区| 国产成人综合网| 日韩成年人视频| 亚洲午夜精品久久久久久性色| 伊人久久高清| 中文字幕一区二区三区5566| 国产乱码精品一区二区三| 国产波霸爆乳一区二区| 亚洲高清免费观看高清完整版| 亚洲第一av| 亚洲三区在线观看| 国产黄色91视频| 日本中文在线播放| 一本色道久久综合亚洲精品小说 | 男女激情视频一区| 天天做夜夜爱爱爱| 亚洲成人av片| 日本综合视频| 大桥未久一区二区三区| 91视频在线看| 亚洲视频在线观看一区二区| 欧美精品在线第一页| 欧美福利在线播放网址导航| 日本三区在线观看| 亚洲欧洲中文日韩久久av乱码| 亚洲欧美激情国产综合久久久| 欧美主播福利视频| 中文精品电影| 中文字字幕码一二三区| 欧美欧美午夜aⅴ在线观看| 青草视频在线免费直播| 欧美一区二区三区四区五区六区| 国产一区二区福利视频| 日韩久久中文字幕| 久久不射电影网| 国产aⅴ精品一区二区三区久久| 色婷婷一区二区三区在线观看| 午夜精品久久久久| 日本中文在线| 久久久av水蜜桃| 国产精品一区二区黑丝| 波多野结衣电车痴汉| 久久人91精品久久久久久不卡| 久久精品国产99久久|