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

问题描述 投票:65回答:4

std::pair和只有两名成员的std::tuple有区别吗? (除了明显的std::pair需要两个,只有两个成员和tuple可能会少...)

c++ visual-studio-2010 std-pair
4个回答
66
投票

有一些差异:

  1. std::tuple永远不会是standard-layout(至少,它不是必须符合标准)。如果std::pair<T, Y>T都是标准布局,那么每个Y都是标准布局。
  2. 获得pair的内容比使用tuple容易一些。你必须在tuple案例中使用函数调用,而pair案例只是一个成员字段。

但那是关于它的。


23
投票

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

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


20
投票

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

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


3
投票

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


1
投票

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

auto [a, b] = FunctionToReturnPairOrTuple();

无需使用get<> :)

© www.soinside.com 2019 - 2024. All rights reserved.