15.C++11之tuple與tie


1. tuple 基本語法
  • std::tuple 是類似 pair 的模板。每個 pair 的成員類型都可不相同,但每個 pair 都恰好有兩個成員。std::tuple 類型的成員類型也不可相同,另外一個 std::tuple 可以有任意數量的成員。
  • 但我們希望 將一些數據組合成單一對象,但又不想麻煩地定義一個新數據結構來表示這些數據 時,std::tuple 是非常有用的。我們可以將 std::tuple 看作一個”快速而隨意”的數據結構。
  • 一個std::tuple 類型的成員數目是沒有限制的,因此,tuple 的成員都是未命名的。要訪問一個tuple的成員,就要使用一個名為 get 的標准庫函數模板。
  • 為了使用 tuple_size 或 tuple_element,我們需要知道一個 tuple 對象的類型。與往常一樣,確定一個對象的類型的最簡單方法就是使用 decltype。
  • std::tuple 的一個 常見用途是從一個函數返回多個值。
  • std::tuple 中元素是被緊密地存儲的(位於連續的內存區域),而不是鏈式結構。
  • std::tuple 是一個編譯期就確定大小的容器,可以容納不同類型的元素。多元組類型在當前標准庫中被定義為可以用任意數量參數初始化的類模板。每一模板參數確定多元組中一元素的類型。所以,多元組是一個多類型、大小固定的值的集合。
2. tuple 與 struct
  • 如果您關心命名問題(即,事實上,用戶定義的結構體 struct 對其 每個成員都有一個有意義的名稱 ,而元組卻沒有),那么您就要求元組實現一些它不應該實現的目標。

  • 簡單地說,如果您想要返回的是具有高級語義的數據包,並且您想要使用的包結構將來可能會被重用,那么您可能應該使用結構,甚至是成熟的類。

  • 然而,Tuple並不是為這種情況而設計的;相反,應用元組的情況是,您所需要的只是即時獲得的輕量級打包機制,並且在使用之后可能會丟棄它。

3. 示例代碼
#include <tuple>
#include <functional>
#include <utility>
#include <typeinfo>

void Person::doTupleTest()
{
	//1.構造tuple
	std::tuple<int, std::string, double> a1(1, "rock", 99.5);
	std::tuple<int, std::string, double> a2(std::make_tuple(2, "bob", 95.5));
    
	//2.讀取tuple中的值
	std::cout << std::get<0>(a1) << '\t' << std::get<1>(a1).c_str() << '\t' << std::get<2>(a1) << std::endl;
    
	//3.修改tuple中的值
	std::get<2>(a1) = 100;
	std::cout << std::get<0>(a1) << '\t' << std::get<1>(a1).c_str() << '\t' << std::get<2>(a1) << std::endl;

	//4.搭配 typedef
	typedef std::tuple<int, std::string, double> MyTuple;
	MyTuple a3(3, "lily", 100);
	std::cout << std::get<0>(a3) << '\t' << std::get<1>(a3).c_str() << '\t' << std::get<2>(a3) << std::endl;
	std::get<2>(a3) = 101.0;
	std::cout << std::get<0>(a3) << '\t' << std::get<1>(a3).c_str() << '\t' << std::get<2>(a3) << std::endl;

	//5.獲取 tuple 中的元素個數
	auto a3Size = std::tuple_size<decltype(a3)>::value;
	std::cout << "the element size of a3 is " << a3Size << std::endl;

	//6.結合 tie ,對 tuple 進行解包為獨立對象 (不需要的元素可以 ignor)
	int a1No = 0;
	double a1Score = 0.0;
	std::tie(a1No, std::ignore, a1Score) = a1;
	std::cout << "a1No:" << a1No << "\t\ta1Score:" << a1Score << std::endl;
}
4. tie 基本語法
  • std::tie 建立左值引用的 tuple,或將 tuple 解包為獨立對象。
  • std::tie 可用於解包 std::pair,由於 std::tuple 擁有從 pair 的轉換賦值。

得到

5. 實例代碼
//1.解包tuple或批量賦值
	std::tuple<int, std::string, double> b1(11, "rockman", 99.5);
	int n;
	std::string s;
	double d;
	std::tie(n, s, d) = b1;
	std::cout << "n:" << n << "\t\ts:" << s.c_str() << "\t\td:" << d <<std::endl;

	//2.解包pair
	std::map<int, std::string> m;
	std::map<int, std::string>::iterator it;
	bool isInserted;
	std::tie(it, isInserted) = m.insert(std::make_pair(1, "rock"));
	if (isInserted)
	{
		std::cout << "Value was inserted successfully!" << std::endl;
	}

	//3.搭配ignor只提取關注的值
	std::tie(std::ignore, s, std::ignore) = b1;
	std::cout << "s: " << s.c_str() << std::endl;
	//tie搭配ignor判斷pair返回值非常方便
	std::tie(std::ignore, isInserted) = m.insert(std::make_pair(2, "bob"));
	if (isInserted)
	{
		std::cout << "Value was inserted successfully!" << endl;
	}
4. 參考資料

https://blog.csdn.net/fengbingchun/article/details/72835446

https://www.jb51.net/article/191040.htm

https://www.jb51.net/article/196971.htm

https://blog.csdn.net/janeqi1987/article/details/102500340


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM