關於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的時候,傳入無效的索引值,或越界的索引值,編譯器會進行報錯提示。

謝謝閱讀。

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