pair和tuple的使用

pair和tuple是用来存储不同类型的值的容器
主要目的是为了方便存储和处理不同类型的数据,它们更适合在特定的情况下用于数据的组织和传递

pair

std::pair 是类模板,提供在一个单元中存储两个相异类型的对象

pair的初始化

1
2
3
std::pair<int, float> pair = std::make_pair(10, 2.1);
auto pair = std::make_pair(10,2.1);
std::pair<int,float> pair(10,2.1);

std::get()

访问 pair 中的元素

示例

1
2
3
4
5
6
7
8
9
#include <cstdio>
#include <utility>
int main() {
std::pair<int, float> pair = std::make_pair(10, 2.1);
printf("pair中的int:%d\n", std::get<int>(pair)); // 使用std::get访问存储在pair中的int类型元素
printf("pair中的float:%.1f\n", std::get<float>(pair)); // 使用std::get访问存储在pair中的float类型元素
printf("pair中的第一个元素:%d\n", std::get<0>(pair)); // 使用std::get访问pair中的第一个元素
printf("pair中的第二个元素:%.1f\n", std::get<1>(pair)); // 使用std::get访问pair中的第二个元素
}

输出

1
2
3
4
pair中的int:10
pair中的float:2.1
pair中的第一个元素:10
pair中的第二个元素:2.1

tuple

类模板 std::tuple 是固定大小的异类值汇集。它是 std::pair 的泛用形式

tuple的初始化

1
2
3
std::tuple<int, float> tuple = std::make_tuple(10, 2.1);
auto tuple = std::make_tuple(10,2.1);
std::tuple<int,float> tuple(10,2.1);

std::get()

元组式访问指定的元素

示例

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <tuple>
int main() {
// 创建一个std::tuple,包含一个整数、一个浮点数和一个字符,使用std::make_tuple初始化
auto tuple = std::make_tuple(10, 2.1, 'A');
std::cout << "tuple中的第一个元素:" << std::get<0>(tuple) << "\n";
std::cout << "tuple中的第二个元素:" << std::get<1>(tuple) << "\n";
std::cout << "tuple中的第三个元素:" << std::get<2>(tuple) << "\n";
std::cout << "tuple中的int类型元素:" << std::get<int>(tuple) << "\n";
std::cout << "tuple中的double类型元素:" << std::get<double>(tuple) << "\n";
std::cout << "tuple中的char类型元素:" << std::get<char>(tuple) << "\n";
}

输出

1
2
3
4
5
6
tuple中的第一个元素:10
tuple中的第二个元素:2.1
tuple中的第三个元素:A
tuple中的int类型元素:10
tuple中的double类型元素:2.1
tuple中的char类型元素:A

tuple_cat

通过连接任意数量的元组来创建一个tuple
通俗点讲就是将两个tuple组成一个

示例

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <tuple>
int main() {
auto tuple1 = std::make_tuple(10, 2.1);
auto tuple2 = std::make_tuple('A', "B");
// 使用 std::tuple_cat 将两个元组合并为一个新的元组
auto tuple = std::tuple_cat(tuple1, tuple2);
std::cout << "tuple中的第一个元素:" << std::get<0>(tuple) << "\n";
std::cout << "tuple中的第二个元素:" << std::get<1>(tuple) << "\n";
std::cout << "tuple中的第三个元素:" << std::get<2>(tuple) << "\n";
std::cout << "tuple中的第四个元素:" << std::get<3>(tuple) << "\n";
}

输出

1
2
3
4
tuple中的第一个元素:10
tuple中的第二个元素:2.1
tuple中的第三个元素:A
tuple中的第四个元素:B

tie

创建左值引用的 tuple ,或将 tuple 解包为独立对象

示例

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(10, 2.1);
int i;
double d;
// 使用std::tie解包tuple中的元素,将其分别赋值给i和d
std::tie(i, d) = tuple;
std::cout << "i的值:" << i << "\n" << "d的值:" << d << "\n";
}

输出

1
2
i的值:10
d的值:2.1

apply

自动解包元组中的元素,将它们传递给函数作为参数

示例

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <tuple>
int main() {
auto tuple = std::make_tuple(10, 2.1);
// 使用 std::apply 调用lambda函数,将tuple中的元素作为参数传递给lambda
std::apply(
[](int a, double b) {
std::cout << "a的值:" << a << "\n";
std::cout << "b的值:" << b << "\n";
},
tuple);
}

输出

1
2
a的值:10
b的值:2.1