首页 > 编程语言 >结构化绑定(c++17)

结构化绑定(c++17)

时间:2024-06-17 09:47:00浏览次数:34  
标签:std 结构化 name 17 auto 绑定 c++ include

结构化绑定(Structured bindings)是 C++17 引入的一个特性,它使得从元组或者其他类型的数据结构中提取元素变得更加方便和直观。它允许我们通过一条语句将一个复杂类型的数据解构成其组成部分,而无需显式地访问每个成员。

使用示例:

假设有一个结构体 Person 和一个返回结构体的函数:

#include <iostream>
#include <tuple>

struct Person {
    std::string name;
    int age;
};

Person getPerson() {
    return {"Alice", 30};
}

int main() {
    auto [name, age] = getPerson();  // 结构化绑定

    std::cout << "Name: " << name << ", Age: " << age << std::endl;

    return 0;
}

在上面的示例中,auto [name, age] = getPerson(); 这一行使用了结构化绑定:

  • getPerson() 函数返回一个 Person 结构体。
  • 使用 auto [name, age]getPerson() 返回的结构体按顺序解构为 nameage 两个变量。
  • 这样就可以直接使用 nameage 变量,而不需要显式地通过成员访问符(.)来访问结构体的成员。

更多示例:

结构化绑定不仅适用于自定义结构体,还可以用于标准库提供的容器类和元组:

#include <iostream>
#include <tuple>
#include <vector>
#include <map>

int main() {
    std::pair<int, std::string> pairData = {42, "Hello"};
    auto [num, text] = pairData;
    std::cout << "Pair data: " << num << ", " << text << std::endl;

    std::tuple<double, int, std::string> tupleData = {3.14, 42, "World"};
    auto [pi, answer, message] = tupleData;
    std::cout << "Tuple data: " << pi << ", " << answer << ", " << message << std::endl;

    std::map<int, std::string> mapData = {{1, "One"}, {2, "Two"}, {3, "Three"}};
    for (const auto& [key, value] : mapData) {
        std::cout << "Key: " << key << ", Value: " << value << std::endl;
    }

    std::vector<std::pair<int, std::string>> vecData = {{1, "Apple"}, {2, "Banana"}, {3, "Cherry"}};
    for (const auto& [index, fruit] : vecData) {
        std::cout << "Index: " << index << ", Fruit: " << fruit << std::endl;
    }

    return 0;
}

在上述示例中,结构化绑定分别应用于 std::pairstd::tuplestd::mapstd::vector,使得代码更加简洁和易读。

注意事项:

  • 结构化绑定的命名需与解构对象的类型成员名称匹配,不能省略。
  • 当解构的对象为引用时,自动推导的类型也会是引用类型。

结构化绑定是 C++17 中非常实用的语法糖,可以大大提升代码的可读性和编写效率,特别是在处理复杂数据结构时。

标签:std,结构化,name,17,auto,绑定,c++,include
From: https://www.cnblogs.com/whcjob/p/18251770

相关文章

  • C/C++ 全局对象注意事项
    在C/C++中,全局对象是指在所有函数外部定义的对象,它们在整个程序生命周期内都是存在的。全局对象有一些特殊的注意事项,下面将详细总结:初始化顺序:全局对象的构造函数在程序开始执行之前就会被调用,这意味着它们会在任何函数(包括main函数)之前被初始化。因此,必须确保全局对象的......
  • 【网络编程开发】17.“自动云同步“项目实践
    17."自动云同步"项目实践文章目录17."自动云同步"项目实践项目简介功能需求需求分析实现步骤1.实现TCP通信server.c服务端tcp.hclient.c客户端函数封装tcp.ctcp.hserver.cclient.c编译运行2.实现文件传输sever.cclient.ctcp.ctcp.hMakeifle编译运行3.实现用文件名......
  • Day24| 77. 组合 、216.组合总和III 、17.电话号码的字母组合
    77.组合对着在回溯算法理论基础给出的代码模板,来做本题组合问题,大家就会发现写回溯算法套路。在回溯算法解决实际问题的过程中,大家会有各种疑问,先看视频介绍,基本可以解决大家的疑惑。本题关于剪枝操作是大家要理解的重点,因为后面很多回溯算法解决的题目,都是这个剪枝套路......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-012 计算指数
    L1-012计算指数真的没骗你,这道才是简单题——对任意给定的不超过10的正整数n,要求你输出2^n。不难吧?输入格式:输入在一行中给出一个不超过10的正整数n。输出格式:在一行中按照格式2^n=计算结果输出2^n的值。输入样例:5输出样例:2^5=32C语言参考......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-009 N个数求和
    L1-009N个数求和本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1a2/b2…给出N个有理数。题目保证所有分子和分母都在长整型范围......
  • 17岁中专女生,闯进全球数学竞赛12强
    今年阿里的数学竞赛结果出来了,在榜单的前列包含一个17岁的中专女生。在2018年时,阿里巴巴达摩院发起了一个国际数学竞赛,基本每年举办一次,参赛不设报名条件,向全球所有数学爱好者开放,竞赛由阿里创始人马云发起。入口:https://damo.alibaba.com/alibaba-global-mathematics-comp......
  • C++智能指针
    std::unique_ptr:独特所有权模型,一个std::unique_ptr在同一时间内只允许有一个对象实例。它不允许被复制,但可以被移动。std::shared_ptr:共享所有权模型,多个std::shared_ptr可以指向同一对象,通过引用计数机制来管理对象的生命周期。当最后一个指向对象的std::shared_ptr被销毁时,对......
  • 5.17博客
    排球课比赛快完了,目前为止一场没输过,我感觉这跟我课脱不了关系学习内容:spring-boot注册条件安卓:<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:id="@+id/ll_item"  an......
  • 【C++】C/C++内存管理
    C/C++内存管理C/C++内存分布C语言中的内存管理方式C++中内存管理方式内置类型自定义类型operatornew和operatordelete函数new和delete实现原理定位new表达式(placement-new)malloc/free与new/delete的区别内存泄漏何为内存泄漏内存泄漏的分类如何检测内存泄漏如何避免内......
  • [转]32th@深入解析C++并发编程:从多线程到现代C++并发库@20240616
    深入解析C++并发编程:从多线程到现代C++并发库你有没有想过,为什么C++在多线程并发编程方面如此强大?C++11标准的发布,为并发编程带来了哪些革命性的变化?本文将深入探讨C++并发编程背后的技术原理,带你领略现代C++并发库的强大之处。文章将结合代码片段,为你揭示C++并发编程的精髓。1.......