关于C++中tuple(不定数的值组)的分析及使用

tuple表示一个不定数量的数据组,对比pair,表示两个元素的对组,tuple就像是pair的扩展。可以指定多个不同性质的元素,使其成为一个数据组,然后像使用一个变量一样,使用tuple对象。

首先,使用tuple时,我们需要包含头文件:

#include <tuple>

一、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);

二、tuple变量的获取、修改

在声明变量之后,如果要提取变量中的元素,我们需要使用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

三、tuple变量的便捷接口

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直接进行转换赋值:

例如,声明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的时候,传入无效的索引值,或越界的索引值,编译器会进行报错提示。

谢谢阅读。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章