1. 程式人生 > >通用工具(2)---Tuple

通用工具(2)---Tuple

Tuple作為pair的擴充套件,可以擁有任意數量的元素

tuple的操作

tuple也是能預設構造,拷貝構造,賦值,比較等,他們都支援隱式轉換,使用make_tuple,其所有元素型別都是通過自動推導獲得型別。使用get時候不允許執行期才傳入索引值。

tuple<int,string,double> p(15,"test",15.0);
auto p2=make_tuple(15,"test",15.0);
get<0>(p) = get<0>(p2);//copy
if(p==p2)//比較

tuple元素的引用

tuple的元素允許使用引用型別,使用reference_wrapper<>函式物件和ref()(引用型別)和cref()(const 引用)函式,可以影響make_pair產生的型別。

std::string s;
auto x=std::make_tuple(s);
std::get<0>(x)="test";
auto x=std::make_tuple(ref(s));
std::get<0>(x)="test";

還能將tuple的值提取出來

std::tuple<int,string,double> p(15,"test",15.0);
int a;
string b;
double c;
std::make_tuple(ref(a),ref(b),ref(c))=p;

也可以使用tie()和std::ignore

std::tuple<int,string,double> p(15,"test",15.0);
int a;
string b;
std::tie(a,b,std::ignore)=p;

tuple和初值列

為了避免一個單一元素被轉換為帶著一個元素的tuple,所以在tuple中使用初值列是不允許隱式轉換的。如果你嘗試將一個初值列賦值或者返回值給tuple(將初值列傳入一個期望獲得tuple的地方)將會報錯

std::tuple<int,string,double> p{15,"test",15.0};//ok
std::tuple<int,string,
double> p2={15,"test",15.0}//error std::vector<std::tuple<int,int>> v{{10,20},{30,40}};//error std::vector<std::tuple<int,int>> v{make_tuple(10,20),make_tuple(30,40)};

tuple其他特性

std::tuple_size<p>::value//獲得tuple元素的個數
std::tuple_element<0,p>::type//獲得p的第一個元素的型別
auto t=std::tuple_cat(p,p2);//將tuple p和p2串接成新的tuple t