欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ tuple元組的基本用法(總結(jié))

 更新時間:2020年07月17日 12:04:13   作者:sevencheng798  
這篇文章主要介紹了C++ tuple元組的基本用法(總結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1,元組簡介

    tuple是一個固定大小的不同類型值的集合,是泛化的std::pair。我們也可以把他當(dāng)做一個通用的結(jié)構(gòu)體來用,不需要創(chuàng)建結(jié)構(gòu)體又獲取結(jié)構(gòu)體的特征,在某些情況下可以取代結(jié)構(gòu)體使程序更簡潔,直觀。std::tuple理論上可以有無數(shù)個任意類型的成員變量,而std::pair只能是2個成員,因此在需要保存3個及以上的數(shù)據(jù)時就需要使用tuple元組了。

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

2,tuple的創(chuàng)建和初始化

 std::tuple<T1, T2, TN> t1;  //創(chuàng)建一個空的tuple對象(使用默認(rèn)構(gòu)造),它對應(yīng)的元素分別是T1和T2...Tn類型,采用值初始化。
std::tuple<T1, T2, TN> t2(v1, v2, ... TN); //創(chuàng)建一個tuple對象,它的兩個元素分別是T1和T2 ...Tn類型; 要獲取元素的值需要通過tuple的成員get<Ith>(obj)進(jìn)行獲取(Ith是指獲取在tuple中的第幾個元素,請看后面具體實例)。
std::tuple<T1&> t3(ref&); // tuple的元素類型可以是一個引用
std::make_tuple(v1, v2); // 像pair一樣也可以通過make_tuple進(jìn)行創(chuàng)建一個tuple對象

tuple的元素類型為引用:

std::string name;
std::tuple<string &, int> tpRef(name, 30);
// 對tpRef第一個元素賦值,同時name也被賦值 - 引用
std::get<0>(tpRef) = "Sven";
 
// name輸出也是Sven
std::cout << "name: " << name << '\n';

3,有關(guān)tuple元素的操作

等價結(jié)構(gòu)體

開篇講過在某些時候tuple可以等同于結(jié)構(gòu)體一樣使用,這樣既方便又快捷。如:

struct person {
 char *m_name;
 char *m_addr;
 int *m_ages;
};
 
//可以用tuple來表示這樣的一個結(jié)構(gòu)類型,作用是一樣的。
std::tuple<const char *, const char *, int>

如何獲取tuple元素個數(shù)

當(dāng)有一個tuple對象但不知道有多少元素可以通過如下查詢:

// 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對象元素的值可以通過get<Ith>(obj)方法進(jìn)行獲取;

Ith - 是想獲取的元素在tuple對象中的位置。

obj - 是想獲取tuple的對象

// 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不支持迭代,只能通過元素索引(或tie解包)進(jìn)行獲取元素的值。但是給定的索引必須是在編譯器就已經(jīng)給定,不能在運行期進(jìn)行動態(tài)傳遞,否則將發(fā)生編譯錯誤:

for(int i=0; i<3; i++)
 std::cout << std::get<i>(mytuple) << " "; //將引發(fā)編譯錯誤

獲取元素的類型

 要想得到元素類型可以通過tuple_element方法獲取,如有以下元組對象:

std::tuple<std::string, int> tp("Sven", 20);
 
// 得到第二個元素類型
 
std::tuple_element<1, decltype(tp)>::type ages; // ages就為int類型
 
ages = std::get<1>(tp);
 
std::cout << "ages: " << ages << '\n';
 
//輸出結(jié)果: 
ages: 20

利用tie進(jìn)行解包元素的值

 如同pair一樣也是可以通過tie進(jìn)行解包tuple的各個元素的值。如下tuple對象有4個元素,通過tie解包將會把這4個元素的值分別賦值給tie提供的4個變量中。

#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

但有時候tuple包含的多個元素時只需要其中的一個或兩個元素,如此可以通過std::ignore進(jìn)行變量占位,這樣將會忽略提取對應(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的元素類型。下面通過引用搭配make_tuple()可以提取tuple的元素值,將某些變量值設(shè)給它們,并通過改變這些變量來改變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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • C語言中關(guān)于計算字符串長度的幾種方式

    C語言中關(guān)于計算字符串長度的幾種方式

    這篇文章主要介紹了C語言中關(guān)于計算字符串長度的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C語言實現(xiàn)電子英漢詞典系統(tǒng)

    C語言實現(xiàn)電子英漢詞典系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)電子英漢詞典系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++構(gòu)造函數(shù)詳解

    C++構(gòu)造函數(shù)詳解

    這篇文章主要介紹了C++構(gòu)造函數(shù)詳解,上一篇文章我們介紹了定義了類,在使用之前,往往還需要對類進(jìn)行初始化。這篇介紹的就是對類進(jìn)行初始化的方法,需要的朋友可以參考一下
    2022-01-01
  • C++學(xué)習(xí)筆記std::vector底層原理及擴容

    C++學(xué)習(xí)筆記std::vector底層原理及擴容

    這篇文章主要為大家介紹了C++學(xué)習(xí)之std::vector底層原理及擴容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 一文詳解C++11中的lambda函數(shù)

    一文詳解C++11中的lambda函數(shù)

    小編可以明確告訴大家:lambda函數(shù)是C++11中最重要的,使用最廣泛的,最具現(xiàn)代風(fēng)格的內(nèi)容,lambda函數(shù)的出現(xiàn)改變了C++編程的思維方式。所以快和小編學(xué)習(xí)一下C++11中l(wèi)ambda函數(shù)的使用吧
    2023-02-02
  • C++ 編寫DLL文件給易語言調(diào)用方法

    C++ 編寫DLL文件給易語言調(diào)用方法

    在本文中我們給大家分享了C++ 編寫DLL文件給易語言調(diào)用的代碼和方法,需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • C++簡單實現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    C++簡單實現(xiàn)RPC網(wǎng)絡(luò)通訊的示例詳解

    RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡稱,它允許程序調(diào)用運行在另一臺計算機上的過程,就像調(diào)用本地的過程一樣。本文將用C++簡單實現(xiàn)RPC網(wǎng)絡(luò)通訊,感興趣的可以了解一下
    2023-04-04
  • C++ seekg函數(shù)用法案例詳解

    C++ seekg函數(shù)用法案例詳解

    這篇文章主要介紹了C++ seekg函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 使用Qt/C++實現(xiàn)WGS84,高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化

    使用Qt/C++實現(xiàn)WGS84,高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt實現(xiàn)WGS84、高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • C語言實現(xiàn)學(xué)生籍貫信息記錄簿

    C語言實現(xiàn)學(xué)生籍貫信息記錄簿

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)學(xué)生籍貫信息記錄簿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論