std::pair
和仅包含两个成员的 std::tuple
之间有什么区别吗?(除了显而易见的 std::pair
需要恰好两个成员,而 tuple
可能有更多或更少成员…)
std::pair
和仅包含两个成员的 std::tuple
之间有什么区别吗?(除了显而易见的 std::pair
需要恰好两个成员,而 tuple
可能有更多或更少成员…)
有一些不同之处:
std::tuple
不要求标准始终是 标准布局。如果 T
和 Y
都是标准布局,则每个 std::pair<T,Y>
都是标准布局。
获取 pair
的内容比获取 tuple
更容易。在 tuple
的情况下,您必须使用函数调用,而在 pair
的情况下只需使用成员字段。
但仅此而已。
std::tuple
的名称较长(多了一个字母)。其中更多的字母需要用右手输入,所以对大多数人来说更容易输入。
话虽如此,std::pair
只能有两个值——不是零、一个、三个或更多。只有两个值。相比之下,元组几乎没有关于值数量的语义限制。因此,如果您想要指定一对值,std::pair
是更准确、类型安全的类型。
std::tuple<>
也是类型安全的(它怎么可能不是呢?),而2
在语义上与pair
没有区别。 - ildjarnT
。最后一个意味着从另一个现有的 T
中进行 memcpy
是可以的。这将复制一个字节,因为空类型的大小为 1。如果你有一个 tuple<T, int>
,如果你得到一个对 T
的引用,你可以复制一个字节到它上面。如果 tuple
优化了 T
的存储,那么它无疑会与 int
重叠。因此,复制该字节部分地复制了 int
,从而破坏了它。 - Nicol Bolasmemcpy
:如果对象是基类子对象,则不可以(注意:在C++20中,这个例外扩展到了no_unique_address成员子对象)。但是对于元组的成员,没有这样的例外。 - Nicol Bolas请注意,在C++17中,可以使用相同的接口从具有两个元素的pair和tuple中读取数据。
auto [a, b] = FunctionToReturnPairOrTuple();
无需使用 get<>
:)
值得注意的是,cppreference网站指出:
“pair是std::tuple的一种特殊情况,它只有两个元素。”
std::pair
]的更改历史,当问题被提出时,这段文字并未出现。这段文字在历史记录中最早出现的时间是[两年后]。 - Casey就我个人而言,我发现 std::tuple 在 GDB 输出方面要难以阅读得多。显然,如果您需要的值超过2个,则 std::pair 将无法满足需求,但我认为这是结构体的一个优点。
std::get<0>(tupleName)
包装在getter中; GetX()
更容易阅读和更短。它有一个小缺点,如果您忘记将其设置为const
方法,则某人可能会做一些愚蠢的事情,例如:GetX() = 20;
。 - Casey
.first
和.second
很方便,但如果代码变更需要第三个(或更多)成员,则它们并没有提供任何帮助。我已经注意到,在任何 Getter 中,我倾向于始终使用std::get
,这样我就不需要改变所有内容,只需改变数据类型和任何make_pair
调用为make_tuple
调用即可。 - Caseytuple
满足标准布局? - Nicol Bolas