C++通用工具:pair和tuple

pair

class pair可將兩個value視爲一個單元。C++標準庫內多處都用到了這個class,好比容器map,multimap,unordered_map等,任何函數若是須要返回兩個value,也須要用到pair,好比minmax()等。ios

class pair的完整功能定義於頭文件函數

#include<utility>
namespace std { template <typename T1,typename T2>
    struct pair { T1 first; T2 second; ... }; }

由上述定義,咱們不可貴出,pair的全部成員都是public的,因此pair提供了直接訪問數據成員的能力。優化

pair操做函數spa

pair<t1,t2> p                                 //default構造函數,創建一個函數,其元素類型分別t1和t2,各自以default函數初始化
pair<t1,t2> p(val1,val2)                      //創建一個pair,元素類型分別爲t1和t2,以val1和val2爲初值
pair<t1,t2> p(piecewise_construct,val1,val2); //創建一個pair,元素類型分別爲tuple t1和t2,以tuple val1和val2爲初值
pair<t1,t2> p(p2)                             //copy構造函數,創建p成爲p2的拷貝
p=p2                                          //將p2的值賦給p
p.first                                       //得到pair內的第一value
p.second                                      //得到pair內的第二value
get<0>(p)                                     //等價於p.first
get<1>(p)                                     //等價於p.second
p1.swap(p2)                                   //互換p1和p2的數據
make_pair<val1,val2>                          //返回一個pair,帶有val1和val2的類型和數值。

注意,pair在進行比較操做時,第一元素具備較高比較級,只有在第一元素相等時,纔會去比較第二元素。code

tuple

tuple又叫元組,它擴展了pair的概念,擁有任意數量的元素。tuple呈現出一個異質元素列,其中每一個類型均可以用來被指定。blog

tuple最初沿用的是C++98的標準,默認建議是至少10個實參,又累贅又限制,後來到C++11,tuple獲得了極大的優化,纔有瞭如今的class tuple接口

#include<tuple>
namespace std { template <typename... Types>
    class tuple; }

tuple的操做get

原則上,tuple的接口十分直觀string

tuple<t1,t2,...,tn> t               //以n個給定類型的元素創建一個tuple,以各元素類型獲得default構造函數完成初始化,基礎類型的初值爲0
tuple<t1,t2,...,tn> t(v1,v2,...,vn) //以n個給定類型的元素創建一個tuple,以給定值完成初始化
t=t2                                //將t2賦值給t
t.swap(t2)                          //互換t1和t2的數據
make_tuple(v1,v2,...)               //以傳入的全部數據和類型創建一個tuple,並容許由此tuple提取數值

tuple的讀入輸出it

#include<iostream> #include<tuple> #include<string>
using namespace std; int main() { tuple<string,string,string,int> t; get<0>(t)="Hello"; get<1>(t)="World"; get<2>(t)=" !"; get<3>(t)=2019; cout<<get<0>(t)<<" "<<get<1>(t)<<get<2>(t)<<" "<<get<3>(t); return 0; }

get<num>(typename tuple)裏,num對應元素編號,以0開始,()內是tuple的名稱,注意,tuple不可在編譯期進行賦值。

相關文章
相關標籤/搜索