C++:std::pair 和std::tie的区别

281 阅读3分钟

在读Vulkan相关代码时遇到:

VulkanRendererImpl::VulkanRendererImpl(NativeWindow *window) : vulkanContext(window)
{
    ...

    std::tie(windowFrameBufferWidth, windowFrameBufferHeight) = 
    vulkanContext.getWindowFrameBufferSize();
   ...
}

std::pair<int, int> VulkanContext::getWindowFrameBufferSize() const
{
    int frameBufferWidth;
    int frameBufferHeight;

    OH_NativeWindow_NativeWindowHandleOpt(window, GET_BUFFER_GEOMETRY, &frameBufferHeight, &frameBufferWidth);
    // LOGE("Window Frame BufferSize width is  %{public}d, height is %{public}d", 
    frameBufferWidth, frameBufferHeight);
    return std::make_pair(frameBufferWidth, frameBufferHeight);
}

下面来看下std::pair 和std::tie的区别

###1. std::pair的特点

-   **定义和用途**

    -   `std::pair`是一个模板类,用于将两个不同类型(也可以是相同类型)的值组合成一个单一的对象。它提供了一种方便的方式来同时处理两个相关的值,就像一个有两个成员的简单结构体。例如,在一个函数中需要返回两个值时,可以使用`std::pair`来封装这两个值并一起返回。
    -   示例代码如下:
#include <iostream>
#include <utility>
std::pair<int, std::string> getPair() {
    return std::make_pair(42, "answer");
}
int main() {
    std::pair<int, std::string> p = getPair();
    std::cout << p.first << " " << p.second << std::endl;
    return 0;
}
  • 在这个例子中,getPair函数返回一个std::pair,其中包含一个整数和一个字符串。在main函数中,可以通过firstsecond成员分别访问这两个值。

  • 存储和访问方式

    • std::pair对象将两个值存储在其内部,访问成员时使用firstsecond这两个公共成员变量。这两个成员变量的类型是在定义std::pair时指定的两个模板参数的类型。例如,对于std::pair<int, double>first的类型是intsecond的类型是double

###2. std::tie的特点

-   **定义和用途**

    -   `std::tie`是一个函数模板,主要用于解包(unpack)一个`std::tuple`(或类似结构,包括`std::pair`)中的元素。它创建了一个左值引用的元组,用于将已有的变量绑定到`tuple`(或`pair`)中的元素上,从而方便地获取`tuple`(或`pair`)中的值并赋值给这些变量。
    -   示例代码如下:
#include <iostream>
#include <utility>
int main() {
    std::pair<int, std::string> p(42, "answer");
    int num;
    std::string str;
    std::tie(num, str) = p;
    std::cout << num << " " << str << std::endl;
    return 0;
}
  • 在这个例子中,std::tie(num, str)创建了一个引用元组,然后通过 = pp中的值解包并赋值给numstr

  • std::pair结合使用的场景

    • 当需要将std::pair中的值提取到多个变量中时,std::tie特别有用。特别是在函数返回std::pair,而调用者想要分别获取这两个值并存储到不同的变量中时。例如,在一个函数返回一个包含错误码和错误消息的std::pair时,调用者可以使用std::tie来分别获取这两个值并进行相应的处理。

###3. 主要区别

-   **数据结构与功能重点**

    -   `std::pair`是一个用于组合两个值的数据结构,重点在于将两个值作为一个整体来存储和传递。它提供了一种简单的方式来表示一对相关的值,并且可以在很多场景下作为函数返回值或者作为容器(如`std::map`中的元素类型)。
    -   `std::tie`主要用于解包操作,它本身不是一个数据存储结构。它的功能是将变量绑定到一个`tuple``pair`中的元素上,以便从这些数据结构中获取值并赋值给变量,是一种方便的解包机制。

-   **使用方式和场景差异**

    -   使用`std::pair`时,更多的是在创建、存储和传递一对相关的值。例如,在关联容器中存储键值对,或者在函数中返回多个相关的值。
    -   `std::tie`则主要在需要解包`pair`(或`tuple`)中的值到其他变量时使用。例如,在处理函数返回的`pair`时,将其中的值提取到不同的变量中,以便分别进行处理。