C Primer第五版筆記 tuple型別

2021-08-27 18:04:42 字數 1642 閱讀 9084

tuple是類似pair的模板。每個pair的成員型別都不相同,但每個pair都有兩個成員。tuple型別的成員型別也都不相同,但乙個tuple可以有任意數量的元素。每個確定的tuple型別的成員數目是固定的,但是兩個tuple型別的成員數目可以不同。

tuple可以用在將一些資料組合成單一物件,但又不想麻煩的定義乙個新資料結構來表示這些資料時。可以將它看做是乙個「快速而隨意」的資料結構。

定義與初始化

當定義乙個tuple時,需要指出每個成員的型別:

tuplethreed;         //預設初始化為0

tuple

,int,list

>

somevalue("lalal",,42,);

tuple的建構函式是explicit的(不能隱式呼叫建構函式),因而必須使用直接初始化語法:

tuple

threed = ; //錯誤

tuple

threed; //正確

類似make_pair函式,標準庫提供了make_tuple函式,也可以生成tuple物件:

auto item = make_tuple("lbj",34,2.03);
類似make_pair,make_tuple函式使用初始值的型別來推斷tuple的型別。

訪問tuple的成員

乙個pair總有兩個成員,所以可以命名為first和second,但是這種方式不捨和tuple,因為tuple的成員數量沒有限制,因此tuple的成員沒有命名。要訪問那乙個tuple的成員,需要使用乙個名為get的標準庫函式模板。其模板實參表示希望訪問第幾個成員,從0開始計數

auto name = get

<0>(item); //返回item的第乙個成員

如果不知道乙個tuple中確定的型別細節資訊,可以使用兩個輔助類模板來查詢tuple成員的數量和型別:

typedef decltype(item) trans;      //trans得到tuple的型別

size_t sz = tuple_size(trans)::value; //得到成員數量

tuple_element<1,trans>::type age = get

<1>(item); //age是乙個int型別

為使用tuple_size和tuple_element,需要知道tuple的型別,而獲得型別的方法可以使用decltype。

關係和相等運算子

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

C Primer第五版筆記 關聯容器

一 型別 關聯容器支援高效的關鍵字查詢和訪問,標準庫中兩個主要的關聯容器是map和set。map中的元素是鍵值對關鍵字表示索引。set中每個元素只包含乙個關鍵字,set支援高效的關鍵字查詢。關聯容器根據三個特性可以分為8種 1 set還是map 2 關鍵字是否可以重複,允許重複的容器名字中都包含單詞...

C Primer第五版筆記 動態陣列

allocator類 為了讓new分配乙個物件陣列,需要在型別名後跟方括號,括號中是分配物件的數目,該數目必須是整型,但不必是常量 new t 分配的記憶體並不是得到乙個陣列,而是得到乙個陣列元素型別的指標,因此不能對動態陣列呼叫begin和end 與普通陣列不同的是,普通陣列不能定義長度為0的陣列...

C Primer第五版筆記 拷貝控制

拷貝賦值函式 析構函式 三 五法則 default和阻止拷貝 乙個類通過定義五種特殊的成員函式來控制其拷貝 賦值 移動以及銷毀操作 拷貝建構函式 拷貝賦值運算子 移動建構函式 移動賦值運算子和析構函式。這些操作都是拷貝控制操作。當實現自己的類的時候要想好在做這些操作時的規則,因為編譯器通常會自動生成...