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

只有两个成员的 std::pairstd::tuple有区别吗?(除了显而易见的 std::pair需要两个且只需要两个成员,而 tuple可能有或多或少的...)

74753 次浏览

两者之间存在一些差异:

  1. std::tuple并不是标准所要求的 标准布局。如果 TY都是标准布局,那么每个 std::pair<T, Y>都是标准布局。

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

但仅此而已。

std::tuple的名称更长(多一个字符)。更多的这些字符是用右手打的,所以对大多数人来说打字更容易。

也就是说,std::pair只能有两个值——而不是0、1、3或更多。两个值。然而,元组对值的数量几乎没有语义限制。因此,如果实际上希望指定一对值,则使用 std::pair是一种更准确、类型安全的类型。

For what it's worth, I find the GDB output of std::tuple to be far more difficult to read. Obviously if you need more than 2 values then std::pair won't work, but I do consider this a point in favor of structs.

This is a very late answer but note that, because std::pair is defined with member variables, its size cannot be optimized using 空基类优化空基类优化 (first and second must occupy distinct addresses, even if one or both is an empty class). This exacerbated by whatever alignment requirements second_type has, so in the worst case the resulting std::pair will be basically twice the size it needs to be.

std::tuple只允许通过 helper 函数进行访问,因此如果其中一个是空的,那么它可以从任何一个类型派生,从而节省开销。海湾合作委员会的实现,至少,肯定做到了这一点... 您可以通过查看标题来验证这一点,但也有 这个作为证据。

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

auto [a, b] = FunctionToReturnPairOrTuple();

不需要使用 get<>:)

或许值得注意的是,cp 优先权规定:

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