• Index

pair 和 tuple

Reads: 34

pair

平面坐标系中有点(x, y),也就是两个值xy组成一个点,那么,就可以使用std::pair,它在utility标准库中。std::pair是由变量first和变量second两个变量组成的数据类型,它是一个,而变量first和变量second叫做类std::pair成员变量

基础示例

它的用法非常简单(注意:VS2017需要将std::pair point{ 2, 5 };改成auto point = std::make_pair(2, 5);,因为VS2017该功能还没开发出来。。。):

#include <iostream> // std::cout std::endl
#include <utility> // std::pair

int main(void)
{
    std::pair point{ 2, 5 }; // 或者写成 std::pair point(2, 5);
    std::cout << "坐标点point的x坐标是:" << point.first << " y坐标是:" << point.second << std::endl;
    return 0;
}

输出结果:

坐标点point的x坐标是:2 y坐标是:5

基础讲解

std::pair声明变量point,第1个参数的值2将由它的成员变量first来保存,第2个参数的值5将由它的成员变量second来保存,然后输出。

编译器在编译期会根据初始化的值,推导出成员变量first和成员变量second的数据类型。代码中,firstsecond的类型都是int

基础拓展

std::pair可以不初始化,当不初始化时,需要指明它的成员变量first和成员变量second的类型,如下:

std::pair<int, float> point;

其中,std::pair<int, float>中的int指明了成员变量first的数据类型,并且初始化为int()std::pair<int, float>中的float指明了成员变量second的数据类型,并且初始化为float()

std::pair也可以使用std::make_pair()函数,它在标准库utility中。使用方式是:auto point = std::make_pair(2, 5);

tuple

例如三维坐标(x, y, z),当需要保存三个值时,就不能用std::pair,此时需要使用元祖std::tuple,它在tuple标准库中。与std::pair不同的是,std::tuple理论上可以有无数个成员变量。用法如下(注意:VS2017需要将std::tuple point{ 1.5, 2.6, 7.2 };改成auto point = std::make_tuple(1.5, 2.6, 7.2);,因为VS2017该功能还没开发出来。。。):

#include <iostream> // std::cout std::endl
#include <tuple> // std::tuple std::get

int main(void)
{
    std::tuple point{ 1.5, 2.6, 7.2 }; // 或者写成 std::tuple point(1.5, 2.6, 7.2);
    std::cout << "x坐标:" << std::get<0>(point) << std::endl; // 获取tuple中的第1个值
    std::cout << "y坐标:" << std::get<1>(point) << std::endl; // 获取tuple中的第2个值
    std::cout << "z坐标:" << std::get<2>(point) << std::endl; // 获取tuple中的第3个值
    return 0;
}

输出结果:

x坐标:1.5
y坐标:2.6
z坐标:7.2

基础讲解

std::tuple的声明与std::pair类似。而且,不初始化时的声明是这样std::tuple<int, float, long long, char> mytuple;,也是与std::pair类似。std::tuple内的元素,理论上可以有1个、2个、3个……到无数个。虽然是无数过,但是编译器会在编译期确定std::tuple的类型,换句话说,std::tuple变量内的元素数量在声明后就已经确定并且固定不变的,不能增加也不能减少。

获取std::tuple中的元素需要使用std::get<第几个数据>(需要获取数据的tuple)。如代码中的std::get<1>(point),就是获取元祖point中的第2个元素(当然,与字符串获取字符一样,它也是从0开始数的,而且C++中所有的“第几个”,都是从0开始数的)。

注意std::get<N>(tuple)中的N必须是非负整数字面量,即0、1、2、3、4……或者constexpr常量,而不能是变量。

基础拓展

std::tuple也可以使用std::make_tuple()函数,它在标准库utility中。使用方式是:auto point = std::make_tuple(1.5, 2.6, 7.2);

获取std::tuple变量内元素的数量可以使用std::tuple_size,它在tuple标准库中。举个例子:

#include <iostream> // std::cout
#include <tuple> // std::tuple std::tuple_size

int main(void)
{
    std::tuple mytuple(10, 'a', 3.14);
    std::cout << "mytuple有";
    std::cout << std::tuple_size<decltype(mytuple)>::value; // 获取mytuple的元素个数
    std::cout << "个元素。" << std::endl;
    return 0;
}

输出结果:

mytuple有3个元素。

获取std::tuple变量内元素的数据类型,可以使用std::tuple_element<第几个元素, tuple的类型>::typestd::tuple_elementtuple标准库中。使用方法如下:

#include <iostream> // std::cout
#include <tuple> // std::tuple std::make_tuple std::tuple_element std::get

int main(void)
{
    auto mytuple = std::make_tuple(10, 'a');

    std::tuple_element<0, decltype(mytuple)>::type first = std::get<0>(mytuple);
    std::tuple_element<1, decltype(mytuple)>::type second = std::get<1>(mytuple);

    std::cout << "mytuple包含了: " << first << " 和 " << second << std::endl;

    return 0;
}

补充知识(了解即可)

  1. std::tuple从C++11开始加入。
  2. 类模板实参推导从C++17开始加入。
  3. C++17前,std::pair的初始化方法是std::pair<int, int> point(1, 2);,为了写代码更简单,初始化一般写成auto point = std::make_pair(1, 2);,这样名字比较长的类型就可以省略。tuple同理。

Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.