bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

如何使用C++多元組Tuple

這篇文章主要講解了“如何使用C++多元組Tuple”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何使用C++多元組Tuple”吧!

創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)品牌網(wǎng)站制作營銷型網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運營、VI設(shè)計、云產(chǎn)品.運維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。

前言

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

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

例如我們可以構(gòu)造一個tuple

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

這個tuple等價于一個結(jié)構(gòu)體

struct A {   char* p;   int len; };

用tupletp就可以不用創(chuàng)建這個結(jié)構(gòu)體了,而作用是一樣的,是不是更簡潔直觀了

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

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

tp的類型實際是:

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

tuple初印象

tuple支持如下的操作

std::tuple<T1, T2, ...TN> t;            //創(chuàng)建一個空的tuple對象(使用默認(rèn)構(gòu)造),它對應(yīng)的元素分別是T1和T2...Tn類型,采用值初始化。 std::tuple<T1, T2, ...TN> t2(v1, v2, ... vn);    //創(chuàng)建一個tuple對象,它的元素分別是T1和T2 ...Tn類型; 每個成員用對應(yīng)的vi進(jìn)行初始化 std::tuple<T1&> t3(ref&); // tuple的元素類型可以是一個引用

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

std::make_tuple(v1, v2);

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

get<i>(t)

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

定義和初始化tuple

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

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

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

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

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

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

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

訪問tuple的成員

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

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

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

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

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

tuple_element<i,tupleType>::type

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

tuple_size<tupleType>::value

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

typedef decltype(item) trans;//trans是item的類型  size_t sz = tuple_size< trans>::value;//返回trans類型對象中成員的數(shù)量  tuple_element<1,trans>::type cnt ; // cnt 為 item第二個成員變量類型  int型  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的關(guān)系和相等運算符的行為類似容器的對應(yīng)操作。這些運算符逐對比較左側(cè)tuple和右側(cè)tuple的成員。只有兩個tuple具有相同數(shù)量的成員時,我們才可以比較它們。而且,為了使用tuple的相等或不等運算符,對每對成員使用==運算符必須都是合法的;為了使用關(guān)系運算符,對每對成員使用  < 必須都是合法的。

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

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

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

利用tie進(jìn)行解包元素的值

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

int main(int argc, char **argv) {     std::tuple<std::string, int, std::string, int> tp;     tp = std::make_tuple("Sven", 25, "Shanghai", 21);     // 定義接收變量     std::string name;     std::string addr;     int ages;     int areaCode;       std::tie(name, ages, addr, areaCode) = tp;     std::cout << "Output: " << '\n';     std::cout << "name: " << name <<", ";     std::cout << "addr: " << addr << ", ";     std::cout << "ages: " << ages << ", ";     std::cout << "areaCode: " << areaCode << '\n';     return 0; }

輸出結(jié)果:

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

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

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

std::tuple中元素是被緊密地存儲的(位于連續(xù)的內(nèi)存區(qū)域),而不是鏈?zhǔn)浇Y(jié)構(gòu)。

如何遍歷tuple成員

N表示tuple中的第N個元素

#include <iostream> #include <tuple> #include <string>   using namespace std;   template<typename Tuple, int N = std::tuple_size<Tuple>::value> struct Printer {   static void log(Tuple& t) {     Printer<Tuple, N - 1>::log(t);       using type = typename std::tuple_element<N - 1, Tuple>::type;     std::string ts = typeid(type).name();     type& v = std::get<N - 1>(t);       std::cout << ts << ":" << v << std::endl;   } };   template<typename Tuple> struct Printer<Tuple,  1> {   static void log(Tuple& t) {     using type = typename std::tuple_element<0, Tuple>::type;     std::string ts = typeid(type).name();     type& v = std::get<0>(t);       std::cout << ts << ":" << v << std::endl;   } };   int main() {   std::tuple<int, bool, string> t = std::forward_as_tuple(11, true, "ok");   Printer<std::tuple<int, bool, string>>::log(t);     return 1; }

tuple做返回相關(guān)作用

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

返回tuple的函數(shù)

tuple<int, string> fun() {         // 用make_tuple來構(gòu)造一個tuple return make_tuple(1024, "tuple",'3'); }

使用函數(shù)返回的tuple

auto tp = fun(); auto id      = std::get<0>(tp);  auto name= std::get<1>(tp);  auto num  = std::get<2>(tp);

感謝各位的閱讀,以上就是“如何使用C++多元組Tuple”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何使用C++多元組Tuple這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

網(wǎng)站欄目:如何使用C++多元組Tuple
文章分享:http://vcdvsql.cn/article2/gghhoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化動態(tài)網(wǎng)站外貿(mào)網(wǎng)站建設(shè)網(wǎng)頁設(shè)計公司網(wǎng)站設(shè)計公司網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)