C++的新类型 pair, tie, array

std::pair

需要 #include <utility>

std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。pair实质上是一个结构体,其主要的两个成员变量是firstsecond,这两个变量可以直接使用。初始化一个pair可以使用构造函数,也可以使用std::make_pair函数

一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象。另外pair可以接受隐式的类型转换,这样可以获得更高的灵活度。

1
2
3
4
5
6
7
pair <string,double> product1 ("tomatoes",3.25);
pair <string,double> product2;
pair <string,double> product3;

product2.first = "lightbulbs"; // type of first is string
product2.second = 0.99; // type of second is double
product3 = make_pair ("shoes",20.0);

pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。

由于pair类型的使用比较繁琐,因为如果要定义多个pair类型的时候,可以使用typedef简化声明

std::tie

std::tie 是在 <tuple> 头文件中定义的。std::tie 是一个函数模板,用于创建一个元组并将多个变量绑定到该元组的元素上。它通常用于同时获取或设置多个值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <tuple>

int main() {
int x = 10;
int y = 20;
int z = 30;

// 将变量 x, y, z 绑定到元组中
std::tie(x, y, z) = std::make_tuple(z, x, y);

std::cout << "x: " << x << std::endl; // 输出: 30
std::cout << "y: " << y << std::endl; // 输出: 10
std::cout << "z: " << z << std::endl; // 输出: 20

return 0;
}

三个整数变量 x、y 和 z,分别初始化为 10、20 和 30。然后,我们使用 std::tie 将这些变量绑定到一个元组中,并使用 std::make_tuple 创建了一个新的元组,其中元素的顺序为 z, x, y。通过将该元组赋值给 std::tie(x, y, z),变量 x、y 和 z 的值发生了重新排列。

最后,我们输出变量 x、y 和 z 的值,可以看到它们已经按照元组的顺序进行了重新赋值。这种方式可以方便地交换变量的值或同时获取多个返回值。

std::array

需要include <array>

std::array仍然是有固定大小的数组,可以随机访问。不像vector那样支持添加或删除元素等改变大小的操作,没有内存重新分配的行为。当定义一个array时,除了指定元素类型,还要指定容器大小。

之所以加入了std::array,就是为了解决内置数组的老问题,比如无法直接对象赋值,无法直接拷贝等等,同时内置的数组又有很多比较难理解的地方,比如数组名是数组的起始地址等等。

简单地说,std::array作为固定大小的数组,又拥有vector的一些特点,比如迭代器访问、获取容量、获得原始指针等高级功能,但它又不会退化成指针给开发人员造成困惑。

1
2
3
std::array<int, 5> a0 = {0, 1, 2, 3, 4};    //正确
std::array<int, 5> a1 = a0; //正确
std::array<int, m> a3; //错误,array不可以用变量指定

std::array不要和数组混合使用。

std::array提供了[]、at、front、back、data的方式来访问元素。array还提供了迭代器的方式进行元素遍历和访问,比如begin, end。以及其它一些函数,比如empty, size, fill,但没有capacity函数。