当前位置: 首页 > article >正文

「C/C++」C++STL容器库 之 std::tuple 多变元组

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • std::tuple:C++标准库中的多变元组
      • 一、`std::tuple`的定义
      • 二、`std::tuple`的构造与初始化
      • 三、`std::tuple`的成员函数和访问元素
      • 四、`std::tuple`的应用场景
      • 五、注意事项
      • 结语

std::tuple:C++标准库中的多变元组

在C++编程中,std::tuple是标准模板库(STL)中的一个强大工具,它允许我们创建和存储一个固定大小的异构元素集合。与std::pair类似,但std::tuple可以包含任意数量的元素,这些元素可以是不同类型的。这使得std::tuple在处理需要返回多个值或存储多个相关但类型不同的数据的场景中非常有用。本文将深入探讨std::tuple的定义、用法、特性和一些实际应用场景。

一、std::tuple的定义

std::tuple位于头文件<tuple>中,它是一个模板类,用于存储一个固定大小的元素集合。这些元素通过模板参数指定,并且可以是任意类型(包括自定义类型)。std::tuple的定义如下:

template< class... Types >
class tuple;

其中,Types...是一个可变参数模板,表示std::tuple可以包含任意数量的类型不同的元素。

二、std::tuple的构造与初始化

std::tuple可以通过多种方式构造和初始化:

  1. 默认构造:创建一个所有元素都使用默认构造函数的tuple对象。

    std::tuple<int, std::string, double> t; // t的元素默认初始化为0(int),空字符串(std::string),0.0(double)
    
  2. 直接初始化:使用括号直接提供元素的值。

    std::tuple<int, std::string, double> t(1, "Hello", 3.14); // t的元素初始化为1,"Hello",3.14
    
  3. 列表初始化(C++11及以上):使用花括号进行初始化(注意,对于std::tuple,列表初始化通常不是最直观的方式,因为需要显式指定类型或使用std::make_tuple)。

    // 这种方式需要编译器能够推断类型,对于复杂类型可能不直观
    auto t = std::tuple<int, std::string, double>{1, "Hello", 3.14}; 
    // 更常用的方式是使用std::make_tuple
    auto t = std::make_tuple(1, "Hello", 3.14);
    
  4. 通过std::make_tuple:这是一个非常方便的函数,可以自动推导类型,并构造一个std::tuple对象。

    auto t = std::make_tuple(1, "Hello", 3.14); // t的类型为std::tuple<int, std::string, double>
    

三、std::tuple的成员函数和访问元素

std::tuple提供了一些成员函数和操作符,但最重要的是如何访问其元素。由于std::tuple的元素是异构的,我们不能通过索引直接访问它们(尽管C++11引入了std::get函数模板),而需要通过类型或索引(从0开始)以及std::get函数模板来访问。

  • std::get函数模板:用于通过类型或索引访问std::tuple的元素。

    std::tuple<int, std::string, double> t(1, "Hello", 3.14);
    int first = std::get<0>(t); // 通过索引访问,得到1
    std::string second = std::get<std::string>(t); // 通过类型访问(需要C++14或更高版本,且类型必须唯一),得到"Hello"
    // 注意:通过类型访问在C++11中是不支持的,且在实际编码中,通过类型访问可能会引发歧义,因此更推荐使用索引访问。
    

    注意:在C++11中,std::get只支持通过索引访问。从C++14开始,如果std::tuple中的类型是唯一的,那么可以通过类型来访问元素,但这种做法并不推荐,因为它可能会降低代码的可读性和可维护性。

  • std::tuple_sizestd::tuple_element:这两个模板类分别用于获取std::tuple的大小(即元素的数量)和元素的类型。

    constexpr std::size_t size = std::tuple_size<decltype(t)>::value; // 得到3
    using FirstType = std::tuple_element<0, decltype(t)>::type; // 得到int
    

四、std::tuple的应用场景

std::tuple的灵活性和通用性使其在多种场景中非常有用:

  1. 返回多个值:当函数需要返回多个相关联的值时,可以使用std::tuple

    std::tuple<int, std::string, double> getPersonInfo() {
        return std::make_tuple(1, "Alice", 5.5);
    }
    
  2. 存储多个值:在需要存储多个相关但类型不同的数据的场景中,std::tuple是一个很好的选择。

    std::vector<std::tuple<int, std::string, double>> people;
    people.push_back(std::make_tuple(1, "Alice", 5.5));
    people.push_back(std::make_tuple(2, "Bob", 6.0));
    
  3. 解包std::tuple:在C++17中,引入了结构化绑定(structured bindings),这使得我们可以更方便地解包std::tuple中的元素。

    auto [id, name, height] = getPersonInfo(); // 假设getPersonInfo返回std::tuple<int, std::string, double>
    

五、注意事项

  • 虽然std::tuple非常灵活,但在大型项目中,如果频繁使用且类型固定,考虑定义自定义结构体或类,以提高代码的可读性和可维护性。
  • 使用std::make_tuple时,可以避免手动指定类型,提高代码的简洁性和类型安全性。
  • 在C++17及更高版本中,优先使用结构化绑定来解包std::tuple,这可以使代码更加简洁和易读。

结语

std::tuple是C++标准库中一个非常强大且灵活的工具,它允许我们创建和存储一个固定大小的异构元素集合。通过了解其定义、构造方式、元素访问方法和应用场景,我们可以更加高效地利用这一特性,编写出更加简洁、清晰和健壮的代码。无论是处理需要返回多个值的函数,还是存储多个相关但类型不同的数据,std::tuple都是一个不可多得的好帮手。


在这里插入图片描述


http://www.kler.cn/a/375688.html

相关文章:

  • 三、k8s快速入门之Kubectl 命令基础操作
  • 12. 线性规划的单纯形法
  • 【清润模胶条】行业调研:前五大厂商份额占比超过60%
  • Linux中NFS配置
  • SpringBoot旋律线:Web音乐网站构建
  • 泛微开发修炼之旅--51关于解决ecology中em_auth_token is empty的报错问题解决方案
  • JS中的正则表达式
  • 第三百零七节 Log4j教程 - Log4j日志格式、Log4j日志到文件
  • 保姆级教程 | 全流程免费:合并多份长宽不同的PDF成相同大小并进行瘦身
  • InnoDB存储引擎对MVCC实现
  • RK3568开发板Openwrt文件系统构建
  • 运维监控丨16条常用的Kafka看板监控配置与告警规则
  • 《机器学习与人类学习:比较、融合与未来展望》
  • CSP-J 和 CSP-S 自测
  • 【系统架构设计师】七、设计模式
  • 制作安装k8s需要的离线yum源
  • 4、在Linux上安装软件
  • Redis数据安全_持久化机制
  • 查看多个通道32bit音频pcm数据
  • ZYNQ RFSoC 的DAC如何做到从 0到Fs频段 信号输出
  • 关于 Golang Weekly
  • Information Theoretical Estimators (ITE) Toolbox的使用(MATLAB)
  • 处理后的视频如何加上音频信息?
  • SQLI LABS | Less-24 POST-Second Oder Injections Real Treat-Stored Injections
  • rabbitmq延时插件安装以及启用
  • Java项目实战II基于Java+Spring Boot+MySQL的桂林旅游景点导游平台(开发文档+数据库+源码)