c 11中的tuple(元組)

2021-06-19 04:06:01 字數 3012 閱讀 5602

**:

這次要講的內容是:c++11中的tuple(元組)。tuple看似簡單,其實它是簡約而不簡單,可以說它是c++11中乙個既簡單又複雜的東東,關於它簡單的一面是它很容易使用,複雜的一面是它內部隱藏了太多細節,要揭開它神秘的面紗時又比較困難。

tuple是乙個固定大小的不同型別值的集合,是泛化的std::pair。和c#中的tuple類似,但是比c#中的tuple強大得多。我們也可以把他當做乙個通用的結構體來用,不需要建立結構體又獲取結構體的特徵,在某些情況下可以取代結構體使程式更簡潔,直觀。

構造乙個tuple

tuple

char*, int>tp = make_tuple(sendpack,nsendsize); //

構造乙個tuple

這個tuple等價於乙個結構體

struct

a;

用tupletp就可以不用建立這個結構體了,而作用是一樣的,是不是更簡潔直觀了。還有一種方法也可以建立元組,用std::tie,它會建立乙個元組的左值引用。

auto tp = return std::tie(1, "

aa", 2

);//tp的型別實際是:

std::tuple

再看看如何獲取它的值:

const

char* data = tp.get

<0>(); //

獲取第乙個值

int len = tp.get

<1>(); //

獲取第二個值

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

int

x,y;

string

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

通過tie解包後,tp中三個值會自動賦值給三個變數。

解包時,我們如果只想解某個位置的值時,可以用std::ignore佔位符來表示不解某個位置的值。比如我們只想解第三個值時:

std::tie(std::ignore,std::ignore,y) = tp; //

只解第三個值了

還有乙個建立右值的引用元組方法:forward_as_tuple。

std::mapm;

m.emplace(std::forward_as_tuple(

10, std::string(20, '

a')));

它實際上建立了乙個類似於std::tuple型別的tuple。

我們還可以通過tuple_cat連線多個tupe

int

main()

輸出結果:

(10, test, 3.14, foo, bar, 10, test, 3.14, 10)
到這裡tuple的用法介紹完了,是不是很簡單,也很容易使用,相信你使用它之後就離不開它了。我前面說過tuple是簡約而不簡單。它有很多高階的用法。它和模板元關係密切,要介紹它的高階用法的時候,讀者需要一定的模板元基礎,如果你只是把它當乙個泛型的pair去使用時,這部分可以不看,如果你想用它高階用法的時候就往下看。讓我們要慢慢揭開tuple神秘的面紗。

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

templatevoid fun(tuple&tp)

獲取tuple中元素的個數:

tuple t;

int size = std::tuple_size::value;

因為tuple的引數是變長的,也沒有for_each函式,如果我們想遍歷tuple中的每個元素,需要自己寫**實現。比如我要列印tuple中的每個元素。

template

struct

tupleprinter

};template

struct tupleprinter1>

};template

void printtuple(const std::tuple&t)

namespace

detail

};template

struct find_index<0, t, args...>

};}template

int find_index(std::tupleconst& t, t&&val)

intmain()

#include #include 

#include

template

struct

template

::std::forward

(f), ::std::forward(t),

::std::

get1>(::std::forward(t)),

::std::forward

(a)...

))};

template

<>

template

-> decltype(::std::forward(f)

(::std::forward

(a)...))

};template

::type

::std::forward

(t)))

void one(int i, double

d)int two(int

i)//

測試**

intmain()

看到這裡,想必大家對tuple有了乙個全面的認識了吧,怎麼樣,它是簡約而不簡單吧。對模板元不熟悉的童鞋可以不看tuple高階用法部分,不要為看不懂而捉急,沒事的,高階部分一般用不到,知道基本用法就夠用了。

tuple和vector比較:

vector只能容納同一種型別的資料,tuple可以容納任意型別的資料;

vector和variant比較:

二者都可以容納不同型別的資料,但是variant的型別個數是固定的,而tuple的型別個數不是固定的,是變長的,更為強大。

C 11中的Tuple和可變引數模版

c 11中的tuple是乙個n元的可變元組,它相當於有n個元素的結構體,只不過這個結構體的成員都是匿名的,tuple中提供了乙個get 方法來獲取某個下標對應的元素的值。另外可以通過make tuple 方法來構造乙個tuple物件。具體用法如下 我們知道tuple中的元素個數是不確定的,而每個元素...

C 11新特性tuple多元陣列

tuple是c 11新的標準庫之一,其表示n元陣列,它相當於有n個成員的結構體,只不過這個結構體的成員都是匿名的。tuple是類似於pair的模板,tuple像是pair的泛化版本,pair只能存放兩個成員,而tuple則可以多個成員,相同的是,pair和tuple都允許其成員的型別不一樣。tupl...

C 中對元組理解Tuple

陣列合併了相同型別的物件,而元組合並了不同型別的物件。元組起源於函式程式語言 如f 在這些語言中頻繁使用元組。在.net4中可以支援使用元組。例如,tuple包含 個元素,tuple包含兩個元素,以此類推。例1 元組型別相同 private tuple divide int dividend,int...