[轉] c++11中的std::tuple元組和std::tie


原文: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些~

結尾

參考鏈接


免責聲明!

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



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