淺析C++元組tuple類(lèi)型
介紹
元組tuple是C++的一個(gè)模板,不同tuple類(lèi)型的成員類(lèi)型也不相同,但是一個(gè)tuple可以有任意數(shù)量的成員。
每個(gè)tuple類(lèi)型的成員個(gè)數(shù)是一定的,但是不同的tuple成員個(gè)數(shù)可以不同。
tuple的定義及初始化
使用tuple要引入tuple頭文件
#include <tuple>
tuple定義以及初始化(我們這里以成員類(lèi)型為int、string、vector為例子)
tuple<int,string,vector<int>> test{1,"hello,world",{4,5,6}};
當(dāng)然也可以使用它的構(gòu)造函數(shù)進(jìn)行初始化
tuple<int, string,vector<int>> test(1,"hello,world",{4,5,6});
存在這種情況,表面上看起來(lái)沒(méi)有進(jìn)行任何初始化操作,但實(shí)際上利用了不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)
tuple<size_t, size_t> test; //每個(gè)成員的值為0
當(dāng)然如果你這樣定義后,又想對(duì)test的初始值所作更改,可以這樣寫(xiě),如下所示。(實(shí)際上現(xiàn)在的test不是原來(lái)的test,它被你新創(chuàng)建的tuple對(duì)象所替代了,嚴(yán)格意義來(lái)講并不算是初始化)
tuple<size_t, size_t> test; //每個(gè)成員的值為0 test = tuple<size_t, size_t>(1,2); //第一個(gè)成員的值為1,第二個(gè)成員的值為2
另外標(biāo)準(zhǔn)庫(kù)定義了make_tuple函數(shù)來(lái)生成tuple對(duì)象,我們可以用auto關(guān)鍵字來(lái)推測(cè)生成的tuple的類(lèi)型
auto test2 = make_tuple(3.14,"wasd");
如果要添加一個(gè)vector作為成員,則情況如下
//錯(cuò)誤寫(xiě)法 auto test2 = make_tuple(3.14,"wasd",{ 3,4,5 }); //正確寫(xiě)法 vector<int> nums = { 3,4,5 }; auto test2 = make_tuple(3.14,"wasd",nums);
tuple的使用
成員訪問(wèn)
說(shuō)起tuple的使用,最能直接想到的自然是對(duì)tuple的訪問(wèn)了。
在C++標(biāo)準(zhǔn)庫(kù)里,有一個(gè)名為get的函數(shù)模板。為了使用get,我們必須指定一個(gè)顯式模板實(shí)參來(lái)指示訪問(wèn)的第幾個(gè)成員,并在函數(shù)參數(shù)中給予它一個(gè)tuple對(duì)象。
tuple<int, string, vector<int>> test{ 1,"hello,world",{4,5,6} }; cout << get<0>(test) << endl; //打印test第一個(gè)成員,其類(lèi)型為int cout << get<1>(test) << endl; //打印test第二個(gè)成員,其類(lèi)型為string cout << get<2>(test)[0] << endl; //打印test第三個(gè)成員vector<int>的第一個(gè)元素
下面是返回結(jié)果
1
hello,world
4
獲取tuple信息
可用以下方法獲取tuple元素個(gè)數(shù)
tuple<int, double, vector<string>> test{ 1,1.23,{"123","456"}}; //獲取tuple成員個(gè)數(shù) size_t num = tuple_size<decltype(test)>::value; //利用tuple某個(gè)成員類(lèi)型來(lái)聲明變量(以第0個(gè)成員為例) tuple_element<0, decltype(test)>::type n = get<0>(test);
拼接tuple
tuple<int, int, int> test(1,2,3); tuple<int, int, int> test2(4,5,6); tuple<int, int, int> test3(7,8,9); //拼接 auto new_tup = tuple_cat(test, test2, test3);
交換tuple
tuple<int, int, int> test(1,2,3); tuple<int, int, int> test2(4,5,6); //交換 test.swap(test2);
tuple解包
tuple使用tie方法進(jìn)行解包,tie的參數(shù)個(gè)數(shù)與tuple成員個(gè)數(shù)一致,否則要用ignore占位
tuple<int,int> test{2,8}; tuple<int,int> test2{2,8,6}; int a, b; //解包 tie(a, b) = test; //ignore占位的情況 tie(a, b, ignore) = test2;
tuple比較
當(dāng)兩個(gè)tuple具有相同數(shù)目的成員,且對(duì)應(yīng)成員類(lèi)型可比較的時(shí)候,tuple比較才合法
//有如下四個(gè)tuple tuple<string, string> test{"1","2"}; tuple<int, int, int> test2{ 1,2,3 }; tuple<int,int> test3{1,2}; tuple<int, int> test4{ 4,5 }; test == test2; //報(bào)錯(cuò),string與int類(lèi)型不能比較 test2 < test3; //報(bào)錯(cuò),test2與test3成員數(shù)量不同 test3 < test4; //正確,該語(yǔ)句值為T(mén)rue
tuple遍歷
tuple沒(méi)有迭代器,其遍歷非常麻煩,其設(shè)計(jì)目的也不在于此(如果項(xiàng)目開(kāi)發(fā)過(guò)程中要對(duì)某一數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷該數(shù)據(jù)結(jié)構(gòu)應(yīng)盡量避免為tuple類(lèi)型,完全可以用list代替)
但此處還是給出遍歷的方法(不推薦使用)
本方法來(lái)自C++Tuple元組的詳細(xì)用法 - 知乎 (zhihu.com)
#include <iostream> #include <tuple> #include <array> #include <utility> using namespace std; template<class Tuple, size_t N> struct PrintTuple { static void Printf(const Tuple& Value) { PrintTuple<Tuple, N - 1>::Printf(Value); cout << "," << get<N - 1>(Value); } }; template<class Tuple> struct PrintTuple<Tuple, 1> { static void Printf(const Tuple& Value) { cout << get<0>(Value); } }; template<class... Args> void PrintfMyTuple(const tuple<Args...>& vlaue) { PrintTuple<decltype(vlaue), sizeof...(Args)>::Printf(vlaue); } int main() { tuple<int, int, int, int> a(2, 3, 1, 4); PrintfMyTuple(a); system("pause"); return 0; }
tuple開(kāi)發(fā)時(shí)的應(yīng)用
在項(xiàng)目開(kāi)發(fā)時(shí),如果我們想讓一個(gè)函數(shù)返回多個(gè)不同類(lèi)型的值的話可以使用tuple。
到此這篇關(guān)于C++元組tuple類(lèi)型的文章就介紹到這了,更多相關(guān)C++元組tuple類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中函數(shù)的聲明、定義及使用的入門(mén)教程
這篇文章主要介紹了C語(yǔ)言中函數(shù)的聲明、定義及使用的入門(mén)教程,重點(diǎn)講述了main函數(shù)的相關(guān)知識(shí),需要的朋友可以參考下2015-12-12C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10C++中vector容器的常用操作方法實(shí)例總結(jié)
vector容器一般被用作創(chuàng)建動(dòng)態(tài)數(shù)組,動(dòng)態(tài)數(shù)組就像Python中的list結(jié)構(gòu)一樣,可以比普通數(shù)組擁有更豐富操作方法,下面就為大家整理了一些最常用的操作:2016-05-05Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例
去水印是個(gè)麻煩事,本文就來(lái)介紹一種方法Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09C語(yǔ)言實(shí)現(xiàn)三子棋游戲含完整代碼
本文詳細(xì)講解了C語(yǔ)言實(shí)現(xiàn)三子棋游戲內(nèi)含完整代碼,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)三子棋游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08c 調(diào)用python出現(xiàn)異常的原因分析
本篇文章是對(duì)使用c語(yǔ)言調(diào)用python出現(xiàn)異常的原因進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Qt使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查
這篇文章主要為大家詳細(xì)介紹了Qt如何使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)增刪改查功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06