日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++多元組Tuple使用方法?你熟悉嗎?快來看看吧

前言

成都創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元黃平做網(wǎng)站,已為上家服務,為黃平各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

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

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

例如我們可以構造一個tuple

 
 
 
 
  1. tupletp = make_tuple(sendPack,nSendSize); 

這個tuple等價于一個結構體

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

用tuple tp就可以不用創(chuàng)建這個結構體了,而作用是一樣的,是不是更簡潔直觀了

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

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

tp的類型實際是:

 
 
 
 
  1. std::tuple 

tuple初印象

tuple支持如下的操作

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

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

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

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

 
 
 
 
  1. get(t) 

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

定義和初始化tuple

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

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

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

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

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

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

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

訪問tuple的成員

一個pair總是有兩個成員,這樣標準庫就可以為他們命名(first和second),但是這種命名方法不適用于tuple,因為一個tuple的類型的成員數(shù)目是沒有限制的。因為,tuple的成員都是未命名的。要訪問一個tuple的成員,就要使用一個名為get的標準庫函數(shù)模板。為了使用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開始計數(shù),意味著get<0>是第一個成員。

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

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

 
 
 
 
  1. tuple_element::type 

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

 
 
 
 
  1. tuple_size::value 

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

 
 
 
 
  1. typedef decltype(item) trans;//trans是item的類型 
  2.  
  3. size_t sz = tuple_size< trans>::value;//返回trans類型對象中成員的數(shù)量 
  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數(shù)據(jù)成員,它表示給定tuple中成員的數(shù)量。 tuple_element模板除了一個tuple類型外,還接受一個索引值。它有一個名為type的public類型成員,表示給定tuple類型中指定成員類型。類似get,tuple_element所使用的索引也是從0開始計數(shù)的。

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

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

 
 
 
 
  1. tuple duo("1","2"); 
  2. tuple twoD(1,2); 
  3.  
  4. bool b = (duo == twoD); // 錯誤,不能比較size_t 和 string 
  5.  
  6. tuple threeD(1,2,3); 
  7.  b = (duo == threeD); // 錯誤,成員數(shù)量不同 
  8. tuple 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 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進行變量占位,這樣將會忽略提取對應的元素??梢孕薷纳鲜隼蹋?/p>

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

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

如何遍歷tuple成員

N表示tuple中的第N個元素

 
 
 
 
  1. #include  
  2. #include  
  3. #include  
  4.   
  5. using namespace std; 
  6.   
  7. template::value> 
  8. struct Printer 
  9.   static void log(Tuple& t) { 
  10.     Printer::log(t); 
  11.   
  12.     using type = typename std::tuple_element::type; 
  13.     std::string ts = typeid(type).name(); 
  14.     type& v = std::get(t); 
  15.   
  16.     std::cout << ts << ":" << v << std::endl; 
  17.   } 
  18. }; 
  19.   
  20. template 
  21. struct Printer 
  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 t = std::forward_as_tuple(11, true, "ok"); 
  33.   Printer>::log(t); 
  34.   
  35.   return 1; 

tuple做返回相關作用

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

返回tuple的函數(shù)

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

使用函數(shù)返回的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); 

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


網(wǎng)站名稱:C++多元組Tuple使用方法?你熟悉嗎?快來看看吧
轉(zhuǎn)載來于:http://m.5511xx.com/article/dpcoesd.html