Structured Bindings(结构化绑定)特性详解

基础介绍

该特性于c++17版本引入。通俗的理解该特性与python中的解包功能有点类似。通过这个特性可以对哪些数据组合进行解包呢?请看下面的列表:

  • 一些c++基本的数据类型进行解包,例如std::pair std::map等,
  • 函数返回值也可以实现解包
  • 数组
  • 自定义类型解包

解包后的返回值类型是通过auto关键字推导得出的。结构化绑定的使用形式一般是:

auto [变量1, 变量2,变量3...] = 函数/基本是数据类型(pair/map等)/数组/自定义类型

基本的使用方法如下所示:

void basic_structured_bindings() {
    // 1. 基本用法
    std::pair<int, std::string> pair = {1, "hello"};
    auto [id, name] = pair;  // 解构pair
    
    // 2. 用于函数返回值
    auto [ptr, ec] = std::to_chars(/*...*/);  // 解构to_chars_result
    
    // 3. 用于数组
    int array[3] = {1, 2, 3};
    auto [x, y, z] = array;  // 解构数组
    
    // 4. 用于结构体
    struct Point {
        int x;
        int y;
    };
    Point p{10, 20};
    auto [px, py] = p;  // 解构结构体
}

解包后获取的值方式也是有多种,种类如下:

  • 值拷贝
  • 值引用
  • const 引用
  • 右值引用

通过结构化绑定后特性解包后的数据也有如上几种方式:

void reference_types() {
    std::pair<int, std::string> pair = {1, "hello"};
    
    // 1. 值拷贝方式
    auto [id1, name1] = pair;
    
    // 2. 值引用方式
    auto& [id2, name2] = pair;
    
    // 3. const引用
    const auto& [id3, name3] = pair;
    
    // 4. 右值引用
    auto&& [id4, name4] = std::make_pair(1, "hello");
}

常见的应用场景

// 1. 遍历map
void iterate_map() {
    std::map<std::string, int> scores{
  
  {"Alice", 95}, {"Bob", 87}};
    
    for (const auto& [name, score] : scores) {
        std::cout << name << ": " << 
1. range-based for循环 range-based for循环是C++11引入的一种新的循环结构,它可以简化对容器和数组等数据结构的遍历。其语法形式如下: ``` for (declaration : range_expression) statement ``` 其中,declaration是一个变量声明,range_expression是一个表示要遍历的数据结构的表达式,statement是循环体中要执行的语句。 range_expression可以是任何具有begin()和end()成员函数的对象,包括STL容器、原生数组、指针等。循环的过程中,declaration将会被自动初始化为range_expression中的每个元素,从而实现遍历。 2. 结构化绑定structured bindings结构化绑定C++17引入的一种新的语言特性,它可以将一个复杂的数据结构拆分成若干个变量,使得代码更加简洁易读。其语法形式如下: ``` auto [var1, var2, ...] = expression; ``` 其中,var1、var2等表示要绑定的变量名,expression表示要进行拆分的数据结构。 结构化绑定可以用在任何支持解包的上下文中,例如函数返回值、for循环中的迭代器等。 3. 引用折叠(reference collapsing) 引用折叠是C++11引入的一种语言特性,用于规定C++中引用类型的组合方式。其规则如下: - 对于右值引用(Rvalue Reference,T&&),无论与左值引用还是右值引用相结合,都会得到右值引用类型。 - 对于左值引用(Lvalue Reference,T&),在不使用模板特化的情况下,左值引用与左值引用相结合得到左值引用,右值引用与左值引用结合得到右值引用类型。 - 在使用模板特化的情况下,引用折叠规则会发生变化。 引用折叠的主要作用是简化模板编程中的引用类型推导。它也是许多新特性的基础,例如完美转发、可变参数模板等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值