109

只有两个成员的anstd::pair和an有区别吗?std::tuple(除了std::pair需要两个而且只有两个成员并且tuple可能或多或少的明显......)

4

6 回答 6

110

有一些区别:

  1. std::tuple标准并不要求永远是standard-layoutstd::pair<T, Y>如果两者都是标准布局T,则每个Y都是标准布局。

  2. pair获取 a 的内容比获取 a 的内容要容易一些tuple。您必须在案例中使用函数调用tuple,而pair案例只是一个成员字段。

但仅此而已。

于 2011-07-14T00:12:54.723 回答
40

一个std::tuple的名字更长(一个额外的字符)。更多这些字符是用右手输入的,因此大多数人更容易输入。

也就是说,std::pair只能有两个值——不是零、一、三或更多。两个值。然而,元组对值的数量几乎没有语义限制。因此,如果std::pair您确实想要指定一对值,则可以使用一个更准确、类型安全的类型。

于 2011-07-14T00:14:04.250 回答
32

这是一个非常晚的答案,但请注意,因为std::pair是用成员变量定义的,所以它的大小不能使用空基类优化来优化(first并且second必须占用不同的地址,即使一个或两个都是空类)。任何对齐要求都会加剧这种情况second_type,因此在最坏的情况下,结果std::pair将基本上是所需大小的两倍。

std::tuple只允许通过辅助函数进行访问,因此如果一个或另一个为空,它可以从任一类型派生,从而节省开销。至少,GCC 的实现肯定是这样做的……您可以通过标头来验证这一点,但也有作为证据。

于 2013-02-26T05:53:12.087 回答
20

请注意,使用 C++ 17,可以使用相同的接口从具有两个元素的对和元组中读取数据。

auto [a, b] = FunctionToReturnPairOrTuple();

不需要使用get<>:)

于 2019-05-29T20:43:02.000 回答
3

对于它的价值,我发现 std::tuple 的 GDB 输出更难阅读。显然,如果您需要超过 2 个值,则 std::pair 将不起作用,但我确实认为这是支持结构的一点。

于 2011-07-26T15:45:45.563 回答
2

也许值得注意的是,cppreference 指出:

“一对是具有两个元素的 std::tuple 的特定情况。”

于 2021-04-19T20:18:40.720 回答