小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

(原創(chuàng))C++11改進(jìn)我們的程序之簡(jiǎn)化我們的程序(七)

 quasiceo 2013-09-13

(原創(chuàng))C++11改進(jìn)我們的程序之簡(jiǎn)化我們的程序(七)

這次要講的內(nèi)容是:c++11中的tuple(元組)。tuple看似簡(jiǎn)單,其實(shí)它是簡(jiǎn)約而不簡(jiǎn)單,可以說它是c++11中一個(gè)既簡(jiǎn)單又復(fù)雜的東東,關(guān)于它簡(jiǎn)單的一面是它很容易使用,復(fù)雜的一面是它內(nèi)部隱藏了太多細(xì)節(jié),要揭開它神秘的面紗時(shí)又比較困難。

  tuple是一個(gè)固定大小的不同類型值的集合,是泛化的std::pair。和c#中的tuple類似,但是比c#中的tuple強(qiáng)大得多。我們也可以把他當(dāng)做一個(gè)通用的結(jié)構(gòu)體來用,不需要?jiǎng)?chuàng)建結(jié)構(gòu)體又獲取結(jié)構(gòu)體的特征,在某些情況下可以取代結(jié)構(gòu)體使程序更簡(jiǎn)潔,直觀。

基本用法

構(gòu)造一個(gè)tuple

tuple<const char*, int>tp = make_tuple(sendPack,nSendSize); //構(gòu)造一個(gè)tuple

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

View Code

用tuple<const char*, int>tp就可以不用創(chuàng)建這個(gè)結(jié)構(gòu)體了,而作用是一樣的,是不是更簡(jiǎn)潔直觀了。還有一種方法也可以創(chuàng)建元組,用std::tie,它會(huì)創(chuàng)建一個(gè)元組的左值引用。

auto tp = return std::tie(1, "aa", 2);
//tp的類型實(shí)際是:
std::tuple<int&,string&, int&>

再看看如何獲取它的值:

const char* data = tp.get<0>(); //獲取第一個(gè)值
int len = tp.get<1>(); //獲取第二個(gè)值

還有一種方法也可以獲取元組的值,通過std::tie解包tuple

int x,y;
string a;
std::tie(x,a,y) = tp; 

通過tie解包后,tp中三個(gè)值會(huì)自動(dòng)賦值給三個(gè)變量。

解包時(shí),我們?nèi)绻幌虢饽硞€(gè)位置的值時(shí),可以用std::ignore占位符來表示不解某個(gè)位置的值。比如我們只想解第三個(gè)值時(shí):

std::tie(std::ignore,std::ignore,y) = tp; //只解第三個(gè)值了

還有一個(gè)創(chuàng)建右值的引用元組方法:forward_as_tuple。

std::map<int, std::string> m;
m.emplace(std::forward_as_tuple(10, std::string(20, 'a')));

它實(shí)際上創(chuàng)建了一個(gè)類似于std::tuple<int&&, std::string&&>類型的tuple。

我們還可以通過tuple_cat連接多個(gè)tupe

View Code

輸出結(jié)果:

(10, Test, 3.14, Foo, bar, 10, Test, 3.14, 10)

 

  到這里tuple的用法介紹完了,是不是很簡(jiǎn)單,也很容易使用,相信你使用它之后就離不開它了。我前面說過tuple是簡(jiǎn)約而不簡(jiǎn)單。它有很多高級(jí)的用法。它和模板元關(guān)系密切,要介紹它的高級(jí)用法的時(shí)候,讀者需要一定的模板元基礎(chǔ),如果你只是把它當(dāng)一個(gè)泛型的pair去使用時(shí),這部分可以不看,如果你想用它高級(jí)用法的時(shí)候就往下看。讓我們要慢慢揭開tuple神秘的面紗。

tuple的高級(jí)用法

獲取tuple中某個(gè)位置元素的類型

  通過std::tuple_element獲取元素類型。

復(fù)制代碼
template<typename Tuple>
void Fun(Tuple& tp)
{
std::tuple_element<0,Tuple>::type first = std::get<0> 
(mytuple);
std::tuple_element<1,Tuple>::type second = std::get<1> 
(mytuple);
}
復(fù)制代碼

遍歷tuple中的每個(gè)元素

  因?yàn)閠uple的參數(shù)是變長(zhǎng)的,也沒有for_each函數(shù),如果我們想遍歷tuple中的每個(gè)元素,需要自己寫代碼實(shí)現(xiàn)。比如我要打印tuple中的每個(gè)元素。

View Code

根據(jù)tuple元素值獲取其對(duì)應(yīng)的索引位置

View Code

展開tuple,并將tuple元素作為函數(shù)的參數(shù)。這樣就可以根據(jù)需要對(duì)tuple元素進(jìn)行處理了

View Code

 

  看到這里,想必大家對(duì)tuple有了一個(gè)全面的認(rèn)識(shí)了吧,怎么樣,它是簡(jiǎn)約而不簡(jiǎn)單吧。對(duì)模板元不熟悉的童鞋可以不看tuple高級(jí)用法部分,不要為看不懂而捉急,沒事的,高級(jí)部分一般用不到,知道基本用法就夠用了。

tuple和vector比較:

vector只能容納同一種類型的數(shù)據(jù),tuple可以容納任意類型的數(shù)據(jù);

vector和variant比較:

二者都可以容納不同類型的數(shù)據(jù),但是variant的類型個(gè)數(shù)是固定的,而tuple的類型個(gè)數(shù)不是固定的,是變長(zhǎng)的,更為強(qiáng)大。

 

c++11 boost技術(shù)交流群:296561497,歡迎大家來交流技術(shù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多