std::pair与只有两个成员的std::tuple的区别
Difference between std::pair and std::tuple with only two members?
只有两个成员的std::pair
和std::tuple
有区别吗?(除了std::pair
需要两个或只有两个成员,tuple
可以有或多或少…)
有一些区别:
-
std::tuple
不需要成为标准布局。如果T
和Y
都是标准布局,则每个std::pair<T, Y>
都是标准布局。 -
获取
pair
的内容比获取tuple
的内容要容易一些。您必须在tuple
情况下使用函数调用,而pair
情况只是一个成员字段。
std::tuple
的名称较长(多一个字符)。这些字符更多是用右手打字,所以对大多数人来说更容易打字。
也就是说,std::pair
只能有两个值,而不是0、1、3或更多。两个值。然而,元组对值的数量几乎没有语义限制。因此,如果您确实想要指定一对值,那么std::pair
是一种更准确、类型安全的类型。
这是一个非常晚的答案,但请注意,因为std::pair
是用成员变量定义的,所以不能使用空基类优化来优化它的大小(first
和second
必须占用不同的地址,即使其中一个或两个都是空类)。second_type
的对齐要求加剧了这种情况,所以在最坏的情况下,std::pair
的大小基本上是它需要的两倍。
std::tuple
只允许通过辅助函数进行访问,因此如果其中一个类型为空,则可以从其中一个类型派生,从而节省开销。GCC的实现,至少,肯定做到了这一点…你可以通过标题来验证这一点,但这里也有证据
请注意,在c++ 17中,可以使用相同的接口从具有两个元素的pair和tuple中读取数据。
auto [a, b] = FunctionToReturnPairOrTuple();
不需要使用get<>
:)
无论如何,我发现std::tuple的GDB输出阅读起来要困难得多。显然,如果您需要两个以上的值,那么std::pair将无法工作,但我确实认为这是支持结构体的一点。
也许值得注意的是,cppreference声明:
" pair是具有两个元素的std::元组的特殊情况。"
- std::ofstream 作为类成员删除复制构造函数?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- std::to_string - 'to_string' 不是 'std' 的成员 - Visual Studio Code 1.42.0
- 使用 std::async 时死锁,将来作为成员
- 可变参数模板参数扩展 类型为 std::function 的类成员
- FreeFileSync C++错误:'byte'不是 'std' 的成员
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 对带有唯一指针的 std::thread 使用类成员函数时出现编译错误
- 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异
- 有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- 访问 std:vector 的类成员 std:vector 在一个类中与另一个 std:vector
- std::异步与非静态成员函数
- 如何在 c++11 中静态断言 std::array 类成员进行排序?
- 将初始化器列表/聚合初始化转发到 std::array 成员
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 在哪里可以找到 std::bitset 的数据成员?
- 没有'str'成员在 GCC 和 Clang 'std::basic_ostream<char>',但 MSVC 没有问题
- unique_ptr问题:不是'std'成员
- std::成员函数的异步调用