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

Cas*_*sey 75 c++ tuples visual-studio-2010 stdtuple std-pair

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

Nic*_*las 75

有一些差异:

  1. std::tuple永远不能通过标准布局(至少,它不是必须符合标准).每一个std::pair<T, Y>是标准的布局如果两个TY是标准布局.

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

但那是关于它的.

  • @Yakk:嗯,我按“。” 我的 IDE 会显示成员列表。我不认为人们需要详细说明。 (3认同)
  • "从一对中获取数据比从元组中获取数据要容易一些.有点." 我注意到.:P虽然`.first`和`.second`很方便,但如果在代码更改中需要第三个(或更多)成员,它们就无法提供帮助.我注意到我倾向于使用`std :: get`,无论在任何Getters中我都不需要改变所有内容,只需要数据类型和任何`make_pair`调用`make_tuple`调用. (2认同)
  • 我想知道 c++17 中的结构化绑定是否已经使这个答案的 1 点和 2 点无效?如果是这样,请也添加一个 c++17 版本。 (2认同)

Ste*_*Lin 26

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

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

  • 当然,[C ++ 20`[[no_unique_address]]`](https://en.cppreference.com/w/cpp/language/attributes/no_unique_address)应该可以消除std :: pair的缺点。 (2认同)

Ara*_*ion 24

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

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

  • 大声笑!很高兴您考虑如何打字!我想指出的是,我可能输入'pair'比'tuple'快20%.这是因为我的手交替键入每个角色,即.RHS:p,LHS:a,RHS:i,LHS:r.至少对我来说,我发现更容易做到! - 但你仍然得到+1! (17认同)
  • "*因此,如果你真的想要指定一对值,那么std :: pair是一种更准确,类型安全的类型.*"它不是更安全或"准确",它只是(可以说)信号意图更直接. (11认同)
  • “因此,__An std::pair 是一种更准确、__type 安全的类型以使用__”而且我认为任何说英语的人都会认为 'pair` 和 'two' 是完全同义的。:-] (2认同)
  • @ildjam:我们在这里分裂,但不,它们不是*完全*同义词.当你说"两双鞋子"时,你的意思是"两双鞋,很可能都是左鞋",或者你的意思是"一双鞋"(其中一双总是留下来,另一双总是正确的) ? (2认同)

小智 19

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

auto [a, b] = FunctionToReturnPairOrTuple();
Run Code Online (Sandbox Code Playgroud)

无需使用get<>:)