C++ tuple元组的基本用法(总结)

C++ tuple元组的基本用法(总结)

什么是tuple

tuple是C++11标准引入的一个新数据结构,是一个固定大小且支持混合类型的序列。

tuple的定义

我们使用std::tuple<Types...>语法来定义一个tuple变量,其中Types是其元素的类型列表。

#include <tuple>
std::tuple<int, double, std::string> my_tuple{1, 3.14, "hello"};

tuple的基本操作

元素访问

可以使用std::get来访问tuple的元素,该函数使用整数索引从0开始访问tuple的元素。

auto i = std::get<0>(my_tuple);      // 1
auto d = std::get<1>(my_tuple);      // 3.14
auto s = std::get<2>(my_tuple);      // "hello"

元素修改

tuple是不可变的,我们无法直接修改某个元素的值。但是可以使用std::make_tuple和std::tie来创建一个新的tuple,从而间接实现元素值的修改。

std::tuple<int, double, std::string> my_tuple{1, 3.14, "hello"};
auto new_tuple = std::make_tuple(std::get<0>(my_tuple), 6.28, std::get<2>(my_tuple));
std::tie(std::get<0>(my_tuple), std::get<1>(my_tuple), std::get<2>(my_tuple)) = new_tuple;

元素大小和类型

tuple的大小可以使用std::tuple_size来获取,需要指明tuple的类型。

std::tuple<int, double, std::string> my_tuple{1, 3.14, "hello"};
int size = std::tuple_size<std::remove_reference<decltype(my_tuple)>::type>::value;   // 3

可以使用std::tuple_element来获取指定位置元素的类型。

std::tuple<int, double, std::string> my_tuple{1, 3.14, "hello"};
using second_type = std::tuple_element<1, decltype(my_tuple)>::type;    // double

示例说明

示例一

此部分代码定义了一个按照姓名字典序、工龄和薪水排序的员工信息:

#include <iostream>
#include <tuple>
#include <vector>
#include <algorithm>

struct Employee
{
    std::string name;
    int age;
    double salary;
};

bool cmp(const Employee& e1, const Employee& e2)
{
    return std::tie(e1.name, e1.age, e1.salary) < std::tie(e2.name, e2.age, e2.salary);
}

int main()
{
    std::vector<Employee> vec{
        {"John", 35, 5000.0},
        {"John", 45, 6000.0},
        {"Eric", 40, 5500.0}
    };

    std::sort(vec.begin(), vec.end(), cmp);

    for (auto& e : vec)
    {
        std::cout << e.name << ", " << e.age << ", " << e.salary << std::endl;
    }
    return 0;
}

在比较两个员工信息时,我们使用了std::tie函数将员工的姓名、工龄和薪水打包成一个tuple,从而实现了基于多个字段的比较。

示例二

此部分代码定义了一个函数,将两个数分别加上一个偏移量,最终返回它们的和以及他们的积:

#include <iostream>
#include <tuple>

std::tuple<int, int, int> process_number(int x, int y, int offset)
{
    x += offset;
    y += offset;
    return std::make_tuple(x + y, x * y, 0);     // 0 这里只是为了占位而返回的
}

int main()
{
    auto result = process_number(3, 4, 2);
    std::cout << "Sum = " << std::get<0>(result) << std::endl;         // Sum = 18
    std::cout << "Product = " << std::get<1>(result) << std::endl;     // Product = 70
    return 0;
}

这里我们使用了std::make_tuple函数创建了一个新的tuple,并使用std::get函数在主函数中获取了返回的各个值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ tuple元组的基本用法(总结) - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 如何解决开机提示”0x7c97cd12″ 指令引用的 “0x00000014″内存。该内存不能为”writ

    如何解决开机提示”0x7c97cd12″ 指令引用的 “0x00000014″内存。该内存不能为”writ” 当开机时出现上述错误提示时,很可能是由于系统文件损坏或者硬件故障引起的。以下是一些可能的解决方法。 1. 执行系统修复 首先尝试通过Windows自带的“系统修复”功能来修复系统文件。 使用U盘或者光盘启动电脑,进入Windows安装界面,选择“修复…

    C 2023年5月23日
    00
  • Mysql环境变量配置方式

    Mysql环境变量配置方式是方便我们在任意位置执行mysql命令行操作的一种方式。下面是完整的攻略: 步骤1:下载并安装Mysql 下载Mysql的安装程序,按照提示完成安装 步骤2:设置环境变量 打开计算机系统的高级系统设置 选择环境变量,然后在系统变量中找到Path,并点击编辑按钮 在编辑环境变量的弹窗中,点击New按钮,添加Mysql安装目录的bin路…

    C 2023年5月24日
    00
  • C++如何动态的生成对象详解

    C++如何动态的生成对象详解 在 C++ 中我们可以使用 new 关键字来动态的生成一个对象,然而有时候我们需要在程序运行时根据一些特定条件创建一组对象,这时候就需要用到动态生成对象的方法。 1. 动态生成对象的基本方法 在 C++ 中,我们可以通过调用构造函数来创建一个对象,因此我们也可以通过在内存中创建对象的方式来动态生成对象。 首先需要使用 void*…

    C 2023年5月22日
    00
  • Android使用jni调用c++/c方法详解

    Android使用Jni调用C++/C方法详解 什么是JNI? JNI全称Java Native Interface,就是Java本地接口,它可以让Java程序调用其他语言编写的动态库,比如C++、C语言等。 Jni调用C++/C方法步骤 准备好动态库。在使用Jni调用C++/C方法之前,首先需要编写好被调用的C++/C代码,并将其编译成动态库。在编译完成后…

    C 2023年5月23日
    00
  • GTA5抢劫任务人员搭配攻略 抢劫任务队员介绍

    GTA5抢劫任务人员搭配攻略 引言 GTA5中的抢劫任务是玩家中非常有趣的游戏内容,但抢劫需要合理的人员配搭才能快速完成任务而不被警察抓住。本文介绍了如何选择合适的人员搭配完成抢劫任务。 抢劫任务人员分类 外围人员:外围人员主要负责支援任务,并提供帮助、掩护、干扰等。外围人员包括司机、狙击手、盾牌、混混等。 技术人员:技术人员负责突破保险柜、绕过安保系统、钻…

    C 2023年5月22日
    00
  • 使用mydumper多线程备份MySQL数据库

    使用mydumper进行多线程备份MySQL数据库是一种非常高效的备份方式。在这里,我将为你提供一份详细的攻略,帮助你了解如何使用mydumper进行多线程备份MySQL数据库。 前置条件 在使用mydumper进行多线程备份MySQL数据库之前,需要先确保以下条件已满足: 安装了mydumper软件(建议使用最新版本) 准备好MySQL数据库连接信息,包括…

    C 2023年5月22日
    00
  • 比特币账本存在哪里?比特币账本是谁在记账?

    比特币是一种去中心化的加密货币,其账本被称为区块链,所有的交易记录都会被记录在这个分布式账本上。在比特币网络中,没有一个具体的机构或个人承担记账的角色,而是由所有参与的矿工通过计算机算力获得区块链账本更新的权利,并依次将记录的新交易打包成新的区块,并将其添加到链的尾部,为整个系统提供保障。 具体来说,比特币的记账过程是由矿工通过一系列计算机算法竞争产生的,其…

    C 2023年5月22日
    00
  • JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】

    下面是“JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】” 的完整攻略: 1. 什么是JSON数组? JSON是JavaScript Object Notation的简称,是一种数据交换格式,常用于网络传输和存储数据。JSON数组则是一种由多个JSON对象组成的数据结构,每个对象之间以逗号分隔,整体用方括号包裹。 示例: [ { "n…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部