Bootstrap

仓鼠学习CPP-17:结构化绑定声明(Structured Bindings)

前言

环境:我自己所用的电脑是mac,然后本篇任何环境,clang和gcc应该都可以

编译程序一律用:

g++ -std=c++17 -o program main.cpp
./program

我之后打算持续更新学习复习cpp17/20/23的内容,希望能通过写作起到以写代复习的作用,也希望大家对于我的问题能指出或者点赞关注~

为什么需要结构化绑定声明?

我想举一个我刚学编程那会的例子(记得还在写C),引用指针数据结构都不太行,那会我特别讨厌写函数,想着把所有的东西都放进main里,为什么呢?因为函数只有一个返回值,有时一旦涉及到想返回多个值就会比较麻烦(当然理论上有的是办法解决就是了)。不过,cpp17给了一个最便捷的方法---结构化绑定声明————

我们由此可以直接轻松解包元组、结构体或数组等复合数据类型的元素,而不必逐个手动访问它们的成员或元素。这大大提高了代码的可读性和简洁性。

使用auto[x1,x2,...]= 需要解包的东西

返回多个值的函数(元组)

代码示例如下:

#include <tuple>
#include <iostream>

std::tuple<int, double> get_pair() {
    return std::make_tuple(1, 3.14);
}

int main() {
    // 使用结构化绑定声明
    auto [i, d] = get_pair();

    std::cout << "i: " << i << ", d: " << d << std::endl;
    //会可以看到正常输出二者的值
    return 0;
}

数组

#include <iostream>


int main() {
    int arr[] = {10, 20, 30};
    auto [a, b, c] = arr; //一键解开,无需arr[0],[1],[2]
    std::cout << a << " " << b << " " << c << std::endl;
}

map

#include <map>
#include <iostream>

int main() {
    std::map<int, std::string> map = {{1, "one"}, {2, "two"}};
    //轻松提取一个个map
    //这里const是个好习惯,特别想提一下111111
    for (const auto& [key, value] : map) {
        std::cout << key << ": " << value << std::endl;
    }

    return 0;
}
//输出:
//1: one
//2: two

Deque

举这个例子是因为发现deque好久不用了,顺便复习一下,这叫双端队列,可以两边插。(想到写后记就是为此)

#include <iostream>
#include <deque>

int main() {
   
    std::deque<int> numbers = {1, 2, 3, 4, 5};

    for (const auto& num : numbers) {
        std::cout << num << " ";
    }

    std::cout << std::endl;

    return 0;
}

Struct

#include <iostream>
#include <string>

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

int main() {
    Person p = {"hamster", 1};

    // 是的,结构体也可以解决
    auto& [name, age] = p;

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

    return 0;
}

后记

其实结构化绑定声明本身不难,难的反而是在写这个的时候,发现cpp有很多容器,但其实并非那么好掌握,有的上课也不一定会教但确实平时会学呜呜,在填了之前的线程文后,之后可能会写容器的复习。

;