C++ tuple元組的基本用法(總結(jié))
1,元組簡(jiǎn)介
tuple是一個(gè)固定大小的不同類(lèi)型值的集合,是泛化的std::pair。我們也可以把他當(dāng)做一個(gè)通用的結(jié)構(gòu)體來(lái)用,不需要?jiǎng)?chuàng)建結(jié)構(gòu)體又獲取結(jié)構(gòu)體的特征,在某些情況下可以取代結(jié)構(gòu)體使程序更簡(jiǎn)潔,直觀。std::tuple理論上可以有無(wú)數(shù)個(gè)任意類(lèi)型的成員變量,而std::pair只能是2個(gè)成員,因此在需要保存3個(gè)及以上的數(shù)據(jù)時(shí)就需要使用tuple元組了。
tuple(元組)在c++11中開(kāi)始引用的。tuple看似簡(jiǎn)單,其實(shí)它是簡(jiǎn)約而不簡(jiǎn)單,可以說(shuō)它是c++11中一個(gè)既簡(jiǎn)單又復(fù)雜的東東,關(guān)于它簡(jiǎn)單的一面是它很容易使用,復(fù)雜的一面是它內(nèi)部隱藏了太多細(xì)節(jié),要揭開(kāi)它神秘的面紗時(shí)又比較困難。
2,tuple的創(chuàng)建和初始化
std::tuple<T1, T2, TN> t1; //創(chuàng)建一個(gè)空的tuple對(duì)象(使用默認(rèn)構(gòu)造),它對(duì)應(yīng)的元素分別是T1和T2...Tn類(lèi)型,采用值初始化。 std::tuple<T1, T2, TN> t2(v1, v2, ... TN); //創(chuàng)建一個(gè)tuple對(duì)象,它的兩個(gè)元素分別是T1和T2 ...Tn類(lèi)型; 要獲取元素的值需要通過(guò)tuple的成員get<Ith>(obj)進(jìn)行獲取(Ith是指獲取在tuple中的第幾個(gè)元素,請(qǐng)看后面具體實(shí)例)。 std::tuple<T1&> t3(ref&); // tuple的元素類(lèi)型可以是一個(gè)引用 std::make_tuple(v1, v2); // 像pair一樣也可以通過(guò)make_tuple進(jìn)行創(chuàng)建一個(gè)tuple對(duì)象
tuple的元素類(lèi)型為引用:
std::string name; std::tuple<string &, int> tpRef(name, 30); // 對(duì)tpRef第一個(gè)元素賦值,同時(shí)name也被賦值 - 引用 std::get<0>(tpRef) = "Sven"; // name輸出也是Sven std::cout << "name: " << name << '\n';
3,有關(guān)tuple元素的操作
等價(jià)結(jié)構(gòu)體
開(kāi)篇講過(guò)在某些時(shí)候tuple可以等同于結(jié)構(gòu)體一樣使用,這樣既方便又快捷。如:
struct person { char *m_name; char *m_addr; int *m_ages; }; //可以用tuple來(lái)表示這樣的一個(gè)結(jié)構(gòu)類(lèi)型,作用是一樣的。 std::tuple<const char *, const char *, int>
如何獲取tuple元素個(gè)數(shù)
當(dāng)有一個(gè)tuple對(duì)象但不知道有多少元素可以通過(guò)如下查詢(xún):
// tuple_size #include <iostream> // std::cout #include <tuple> // std::tuple, std::tuple_size int main () { std::tuple<int, char, double> mytuple (10, 'a', 3.14); std::cout << "mytuple has "; std::cout << std::tuple_size<decltype(mytuple)>::value; std::cout << " elements." << '\n'; return 0; } //輸出結(jié)果: mytuple has 3 elements
如何獲取元素的值
獲取tuple對(duì)象元素的值可以通過(guò)get<Ith>(obj)方法進(jìn)行獲??;
Ith - 是想獲取的元素在tuple對(duì)象中的位置。
obj - 是想獲取tuple的對(duì)象
// tuple_size #include <iostream> // std::cout #include <tuple> // std::tuple, std::tuple_size int main () { std::tuple<int, char, double> mytuple (10, 'a', 3.14); std::cout << "mytuple has "; std::cout << std::tuple_size<decltype(mytuple)>::value; std::cout << " elements." << '\n'; //獲取元素 std::cout << "the elements is: "; std::cout << std::get<0>(mytuple) << " "; std::cout << std::get<1>(mytuple) << " "; std::cout << std::get<2>(mytuple) << " "; std::cout << '\n'; return 0; } //輸出結(jié)果: mytuple has 3 elements. the elements is: 10 a 3.14
tuple不支持迭代,只能通過(guò)元素索引(或tie解包)進(jìn)行獲取元素的值。但是給定的索引必須是在編譯器就已經(jīng)給定,不能在運(yùn)行期進(jìn)行動(dòng)態(tài)傳遞,否則將發(fā)生編譯錯(cuò)誤:
for(int i=0; i<3; i++) std::cout << std::get<i>(mytuple) << " "; //將引發(fā)編譯錯(cuò)誤
獲取元素的類(lèi)型
要想得到元素類(lèi)型可以通過(guò)tuple_element方法獲取,如有以下元組對(duì)象:
std::tuple<std::string, int> tp("Sven", 20); // 得到第二個(gè)元素類(lèi)型 std::tuple_element<1, decltype(tp)>::type ages; // ages就為int類(lèi)型 ages = std::get<1>(tp); std::cout << "ages: " << ages << '\n'; //輸出結(jié)果: ages: 20
利用tie進(jìn)行解包元素的值
如同pair一樣也是可以通過(guò)tie進(jìn)行解包tuple的各個(gè)元素的值。如下tuple對(duì)象有4個(gè)元素,通過(guò)tie解包將會(huì)把這4個(gè)元素的值分別賦值給tie提供的4個(gè)變量中。
#include <iostream> #include <tuple> #include <utility> 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é)果: Output: name: Sven, addr: Shanghai, ages: 25, areaCode: 21
但有時(shí)候tuple包含的多個(gè)元素時(shí)只需要其中的一個(gè)或兩個(gè)元素,如此可以通過(guò)std::ignore進(jìn)行變量占位,這樣將會(huì)忽略提取對(duì)應(yīng)的元素??梢孕薷纳鲜隼蹋?/p>
#include <iostream> #include <tuple> #include <utility> 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 = 110; std::tie(name, ages, std::ignore, std::ignore) = 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é)果: Output: name: Sven, addr: , ages: 25, areaCode: 110
tuple元素的引用
前面已經(jīng)列舉了將引用作為tuple的元素類(lèi)型。下面通過(guò)引用搭配make_tuple()可以提取tuple的元素值,將某些變量值設(shè)給它們,并通過(guò)改變這些變量來(lái)改變tuple元素的值:
#include <iostream> #include <tuple> #include <functional> int main(int argc, char **agrv) { std::tuple<std::string, int, float> tp1("Sven Cheng", 77, 66.1); std::string name; int weight; float f; auto tp2 = std::make_tuple(std::ref(name), std::ref(weight), std::ref(f)) = tp1; std::cout << "Before change: " << '\n'; std::cout << "name: " << name << ", "; std::cout << "weight: " << weight << ", "; std::cout << "f: " << f << '\n'; name = "Sven"; weight = 80; f = 3.14; std::cout << "After change: " << '\n'; std::cout << "element 1st: " << std::get<0>(tp2) << ", "; std::cout << "element 2nd: " << std::get<1>(tp2) << ", "; std::cout << "element 3rd: " << std::get<2>(tp2) << '\n'; return 0; } //輸出結(jié)果: Before change: name: Sven Cheng, weight: 77, f: 66.1 After change: element 1st: Sven, element 2nd: 80, element 3rd: 3.14
tuple交換
tuple<int, std::string, float> t4(11, "Test", 3.14); cout << get<0>(t3) << " " << get<0>(t4) << endl; t3.swap(t4); cout << get<0>(t3) << " " << get<0>(t4) << endl;
排序
bool cmp(tuple<string,int,char> a,tuple<string,int,char> b){ return a<b; return get<1>(a)<get<1>(b); // 也可以按某列排序 } main(){ tuple<string,int,char> my_tuple[10]; my_tuple[0] = std::make_tuple ("Pipr",42,'a'); my_tuple[1] = std::make_tuple ("Piper",41,'a'); my_tuple[2] = std::make_tuple ("Pper",45,'a'); my_tuple[3] = std::make_tuple ("Pier",49,'a'); for(int i=0;i<4;++i){ cout << get<0>(my_tuple[i]) << " " << get<1>(my_tuple[i]) << " "; } cout << endl; sort(my_tuple,my_tuple+4,cmp); for(int i=0;i<4;++i){ cout << get<0>(my_tuple[i]) << " " << get<1>(my_tuple[i]) << " "; } cout << endl; }
到此這篇關(guān)于C++ tuple元組的基本用法(總結(jié))的文章就介紹到這了,更多相關(guān)C++ tuple元組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式
這篇文章主要介紹了C語(yǔ)言中關(guān)于計(jì)算字符串長(zhǎng)度的幾種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08C語(yǔ)言實(shí)現(xiàn)電子英漢詞典系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電子英漢詞典系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++學(xué)習(xí)筆記std::vector底層原理及擴(kuò)容
這篇文章主要為大家介紹了C++學(xué)習(xí)之std::vector底層原理及擴(kuò)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10C++ 編寫(xiě)DLL文件給易語(yǔ)言調(diào)用方法
在本文中我們給大家分享了C++ 編寫(xiě)DLL文件給易語(yǔ)言調(diào)用的代碼和方法,需要的朋友們學(xué)習(xí)下。2019-01-01C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解
RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡(jiǎn)稱(chēng),它允許程序調(diào)用運(yùn)行在另一臺(tái)計(jì)算機(jī)上的過(guò)程,就像調(diào)用本地的過(guò)程一樣。本文將用C++簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊,感興趣的可以了解一下2023-04-04使用Qt/C++實(shí)現(xiàn)WGS84,高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化
這篇文章主要為大家詳細(xì)介紹了如何使用Qt實(shí)現(xiàn)WGS84、高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07C語(yǔ)言實(shí)現(xiàn)學(xué)生籍貫信息記錄簿
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生籍貫信息記錄簿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06