只有两个成员的std :: pair和std :: tuple之间的区别?

时间:2011-07-14 00:09:55

标签: c++ visual-studio-2010 std-pair

只有两名成员的std::pairstd::tuple之间是否存在差异? (除了显而易见的是std::pair需要两个且只有两个成员且tuple可能会少一些......)

6 个答案:

答案 0 :(得分:67)

存在一些差异:

  1. std::tuple永远不能通过standard-layout(至少,它不是必需的符合标准)。如果std::pair<T, Y>T都是标准布局,则每个Y都是标准布局。

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

  3. 但那是关于它的。

答案 1 :(得分:23)

这是一个非常晚的答案,但请注意,由于std::pair是使用成员变量定义的,因此无法使用empty base class optimization优化其大小(firstsecond必须占用不同的地址,即使其中一个或两个都是空类)。任何对齐要求second_type都会加剧这种情况,因此在最坏的情况下,结果std::pair的大小基本上是其所需的两倍。

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

答案 2 :(得分:20)

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

那就是说,std::pair只能有两个值 - 不是零,一个,三个或更多。两个值。但是,元组对值的数量几乎没有语义限制。因此,如果您确实要指定一对值,std::pair是一种更准确,类型安全的类型。

答案 3 :(得分:3)

对于它的价值,我发现std :: tuple的GDB输出要难以阅读。显然,如果你需要超过2个值,那么std :: pair将不起作用,但我认为这一点有利于结构。

答案 4 :(得分:1)

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

auto [a, b] = FunctionToReturnPairOrTuple();

无需使用get<>:)

答案 5 :(得分:1)

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

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