原文:c++11中的std::tuple元組和std::tie | yoko blog
功能簡介
std::tuple是c++11提供的新模板類,在很多流行語言都有對應的實現,一般翻譯為元組。使用它可以把多個不同類型的變量組合成一個對象。
簡單示例
以下是std::tuple的簡單示例(來源:https://en.cppreference.com/w/cpp/utility/tuple)
#include <tuple>
#include <iostream>
#include <string>
#include <stdexcept>
std::tuple<double, char, std::string> get_student(int id)
{
// C++11構建tuple的寫法
if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson");
// C++17提供了更方便的構建tuple的寫法
//if (id == 0) return { 3.8, 'A', "Lisa Simpson" };
if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten");
if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum");
throw std::invalid_argument("id");
}
int main()
{
auto student0 = get_student(0);
// 通過下標位置獲取tuple中對應的元素
std::cout << "ID: 0, "
<< "GPA: " << std::get<0>(student0) << ", "
<< "grade: " << std::get<1>(student0) << ", "
<< "name: " << std::get<2>(student0) << '\n';
// 通過tie將tuple中的元素解構至多個變量中
double gpa1;
char grade1;
std::string name1;
std::tie(gpa1, grade1, name1) = get_student(1);
std::cout << "ID: 1, "
<< "GPA: " << gpa1 << ", "
<< "grade: " << grade1 << ", "
<< "name: " << name1 << '\n';
// C++17提供了更方便的解構寫法
//auto [ gpa2, grade2, name2 ] = get_student(2);
//std::cout << "ID: 2, "
// << "GPA: " << gpa2 << ", "
// << "grade: " << grade2 << ", "
// << "name: " << name2 << '\n';
}
和struct比較
先看例子,再做比較
struct student {
double gpa;
char grade;
std::string name;
};
student get_student(int id) {
if (id == 0) {
student s;
s.gpa = 3.8;
s.grade = 'A';
s.name = "Lisa Simpson";
return s;
}
// ...省略構建其余id的重復代碼,只做簡單演示
}
int main {
auto student0 = get_student(0);
std::cout << "ID: 0, "
<< "GPA: " << student0.gpa << ", "
<< "grade: " << student0.grade << ", "
<< "name: " << student0.name << '\n';
// ...省略獲取其余id的重復代碼,只做簡單演示
}
相比較於std::tuple,struct需要定義結構體這個復合類型。
如果單說以上所舉例的這個場景,個人覺得struct的寫法表意更清晰些。
原因是函數get_student所返回的gpa、grade、name三個元素變量在含義上本身是非常緊密的。
假設我們除了這個函數,還有其他地方需要同時使用這三個變量,比如update_student或print_student等,那么struct的寫法將更合適些。
多說一句,作為開發,我們要保持學習新知識的習慣。但是不能有了新錘子,就看哪都是釘子。為了用新技術而用。
而應該帶着新錘子,觀察和思考哪有合適釘子,再合理運用。
和std::pair比較
先看例子,再做比較
std::pair<double, std::pair<char, std::string> > get_student(int id) {
if (id == 0) {
return std::make_pair(3.8, std::make_pair('A', "Lisa Simpson"));
}
// ...省略構建其余id的重復代碼,只做簡單演示
}
int main() {
auto student0 = get_student(0);
std::cout << "ID: 0, "
<< "GPA: " << student0.first << ", "
<< "grade: " << student0.second.first << ", "
<< "name: " << student0.second.second << '\n';
// ...省略獲取其余id的重復代碼,只做簡單演示
return 0;
}
相比較於std::tuple,std::pair如果想要支持多於2個的變量,需要多層嵌套或結合struct使用。
std::tie的其他用法
std::tie除了第一個例子中演示的用於解構std::tuple中的元素,還可以用來將多個變量構造成std::tuple,從而做大小比較。例如 https://en.cppreference.com/w/cpp/utility/tuple/tie 中演示的例子。這種寫法更modern些~
結尾
參考鏈接
