赞
踩
tuple表示一个不定数量的数据组,对比pair,表示两个元素的对组,tuple就像是pair的扩展。可以指定多个不同性质的元素,使其成为一个数据组,然后像使用一个变量一样,使用tuple对象。
首先,使用tuple时,我们需要包含头文件:
#include <tuple>
我们先看看如何声明一个tuple变量:
tuple<int, float, double, char, string> t;
以上声明了一个tuple类型的变量,其中包含五种类型的元素,包括int,float,double,char,string。
也可以使用自动类型推导auto 结合 make_tuple()接口,直接赋值,声明一个tuple变量:
auto t = make_tuple(1, 2.2, 3.33);
在声明变量之后,如果要提取变量中的元素,我们需要使用get关键字来获取tuple中的元素。因为tuple并非STL中的容器,所以不存在迭代器让我们遍历提取其中的元素值。
get是C++11新推出的关键字,类似于使用pair中的first/second
get的使用方式如下:索引值从0开始,代表了tuple变量中的数据位置,后面括号内是tuple变量名称。
get<索引值>(tuple变量);
关于get的使用代码如下:
auto t = make_tuple(1, 2.2, 3.33);
cout << get<0>(t) << endl; // 1
cout << get<1>(t) << endl; // 2.2
cout << get<2>(t) << endl; // 3.33
另外,也可以使用get来修改tuple中的变量,修改方式如下:
auto t = make_tuple(1, 2.2, 3.33);
get<0>(t) = 100; // 1 -> 100
get<1>(t) = 200.222; // 2.2 -> 200.222
get<2>(t) = 300.333; // 3.33 -> 300.333
1、swap()
使用swap()可以互换两个tuple变量的数据。使用方式如下:
auto t1 = make_tuple(1, 2.2, 3.33);
auto t2 = make_tuple(2, 3.3, 4.44);
t1.swap(t2); // 交换元素值
swap(t1, t2); // 交换元素值,包含<algorithm>头文件
2、tie()
tie()接口的功能是建立一个具有reference性质的tuple变量,也就是对tuple中元素的修改,会改变所引用的变量值。
使用场景如下:
int main() { // 声明三个待引用的变量 int v1 = 10; double v2 = 20.22; string v3 = "string test"; auto i = tie(v1, v2, v3); // 修改tuple变量中的值,会对引用的变量产生影响 get<0>(i) = 100; get<1>(i) = 200.222; get<2>(i) = "string change"; cout << "v1 = " << v1 << endl; // 100 cout << "v2 = " << v2 << endl; // 200.222 cout << "v3 = " << v3 << endl; // string change return 0; }
函数执行结果如下:
v1 = 100
v2 = 200.222
v3 = string change
另外,如果只想将tuple中的某一项声明为引用的话,可以使用std::ref() 接口来实现,使用如下:
int v1 = 10;
string v2 = "string test";
auto i = make_tuple(v1, std::ref(v2)); // 只将v2声明为引用的形式
get<1>(i) = "string changed"; // 对tuple中第2个变量的修改也就是v2的修改
cout << "v2 = " << v2 << endl; // v2 = string changed
3、tuple_cat()
使用tuple_cat()可以将多个tuple变量连接成为一个tuple变量,类似于拼接字符串一样的处理,只不过此处处理的是多个tuple变量,使用方式如下:
int main()
{
auto v1 = make_tuple(100, 200);
auto v2 = make_tuple(1.11, 2.22);
auto v3 = make_tuple('c', "str2");
// 将 v1,v2,v3 连接起来
auto vcat = tuple_cat(v1, v2, v3);
cout << get<0>(vcat) << endl; // 100
cout << get<5>(vcat) << endl; // str2
return 0;
}
tuple可以和pair直接进行转换赋值:
例如,声明tuple变量时,直接以pair变量为初始值;或者直接将pair变量赋值给tuple,至于将tuple变量赋值给pair,是不可以直接进行赋值的,这种情况暂时不做讨论。
pair<int, double> p(1, 2.2);
auto i = make_tuple(p); // 使用pair来初始化tuple
i = p; // 使用pair来为tuple赋值
p = i; // error 不可以直接赋值
最后,如果使用get的时候,传入无效的索引值,或越界的索引值,编译器会进行报错提示。
谢谢阅读。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。