C++ 中的 std::tuple (元组)的使用

C++ 中的 std::tuple (元组),它是 C++11 及以上标准提供的一个通用的、固定大小的异构值集合,简单来说就是可以把不同类型的数据打包成一个整体。

一、核心概念与基础用法

std::tuple 解决的核心问题是:需要一个容器同时存储不同类型的数据(比如同时存 int 、 std::string 、 double ),且不需要自定义结构体/类。

  1. 基本使用示例(创建、访问、修改)
cpp 复制代码
  
#include <iostream>
#include <tuple>
#include <string>

int main() {
    // 1. 创建 tuple:可以存储不同类型的元素
    // 格式:std::tuple<类型1, 类型2, ...> 变量名(值1, 值2, ...);
    std::tuple<int, std::string, double> student(101, "张三", 95.5);

    // 2. 访问元素:使用 std::get<索引>(tuple对象),索引从0开始
    std::cout << "学号:" << std::get<0>(student) << std::endl;
    std::cout << "姓名:" << std::get<1>(student) << std::endl;
    std::cout << "成绩:" << std::get<2>(student) << std::endl;

    // 3. 修改元素:直接通过 std::get 赋值(前提是元素类型可修改)
    std::get<2>(student) = 98.0;
    std::cout << "修改后成绩:" << std::get<2>(student) << std::endl;

    // 4. 便捷创建:std::make_tuple 自动推导类型,无需手动指定
    auto product = std::make_tuple("手机", 2999.99, 100); // 类型:tuple<const char*, double, int>

    // 5. 解包 tuple:std::tie 把tuple的值解包到普通变量中
    std::string name;
    double price;
    int stock;
    std::tie(name, price, stock) = product; // 解包到三个变量
    std::cout << "商品:" << name << " 价格:" << price << " 库存:" << stock << std::endl;

    // 6. 忽略某个元素:用 std::ignore 跳过不需要的解包值
    std::tie(std::ignore, price, std::ignore) = product; // 只获取价格
    std::cout << "仅获取价格:" << price << std::endl;

    return 0;
}
  1. 输出结果
plaintext 复制代码
  
学号:101
姓名:张三
成绩:95.5
修改后成绩:98
商品:手机 价格:2999.99 库存:100
仅获取价格:2999.99

二、进阶用法

  1. 获取 tuple 的大小

使用 std::tuple_size 可以编译期获取 tuple 的元素个数:

cpp 复制代码
  
#include <tuple>
#include <iostream>

int main() {
    std::tuple<int, std::string, double> t;
    // 编译期常量,输出 3
    std::cout << "tuple大小:" << std::tuple_size<decltype(t)>::value << std::endl;
    return 0;
}
  1. 拼接 tuple(C++17 及以上)

使用 std::tuple_cat 可以将多个 tuple 拼接成一个新的 tuple:

cpp 复制代码
  
#include <tuple>
#include <string>
#include <iostream>

int main() {
    auto t1 = std::make_tuple(1, "a");
    auto t2 = std::make_tuple(3.14, true);
    // 拼接后:tuple<int, const char*, double, bool>
    auto t3 = std::tuple_cat(t1, t2);
    
    std::cout << std::get<0>(t3) << " " << std::get<1>(t3) 
              << " " << std::get<2>(t3) << " " << std::get<3>(t3) << std::endl;
    // 输出:1 a 3.14 1
    return 0;
}
  1. 结构化绑定(C++17 及以上,简化解包)

这是最常用的便捷用法,直接将 tuple 解包到变量:

cpp 复制代码
  
#include <tuple>
#include <string>
#include <iostream>

int main() {
    auto student = std::make_tuple(102, "李四", 88.0);
    // 结构化绑定:直接定义变量接收tuple的元素
    auto [id, name, score] = student;
    std::cout << id << " " << name << " " << score << std::endl; // 输出:102 李四 88
    return 0;
}

三、使用场景

  1. 函数返回多个不同类型的值(替代输出参数,更优雅);
  2. 临时打包不同类型的数据,无需自定义结构体;
  3. 与 STL 算法/容器结合(比如 std::map 的 insert 返回值就是 std::pair ,而 std::pair 是 std::tuple 的特例,仅含两个元素)。

总结

  1. std::tuple 是 C++ 中存储异构、固定大小数据的核心工具,无需自定义结构体即可打包不同类型的值;
  2. 访问元素用 std::get<索引> ,C++17 后推荐用结构化绑定简化解包;
  3. 常用辅助工具: std::make_tuple (自动推导类型创建)、 std::tie (解包到变量)、 std::tuple_cat (拼接元组)、 std::tuple_size (获取元素个数)。
相关推荐
yaoxin5211234 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫4 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp5 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的5 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉5 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉5 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
凡人叶枫6 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员6 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言
code bean6 小时前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
LabVIEW开发7 小时前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview