前言
环境:我自己所用的电脑是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有很多容器,但其实并非那么好掌握,有的上课也不一定会教但确实平时会学呜呜,在填了之前的线程文后,之后可能会写容器的复习。