【问题标题】:When is it good to use std::pair?什么时候使用 std::pair 比较好?
【发布时间】:2013-11-08 10:55:16
【问题描述】:

我的印象是定义自己的结构总是更好,这样我就可以使用有意义的字段名称而不是firstsecond

标准使用std::pair 的一个地方是用于访问std::map 的元素。 first 是键,second 是值。拥有一个特定的key_value_pair 模板,并将其字段称为keyvalue 而不是firstsecond,不是更好吗?在我看来,它可以免费使代码更具可读性。

【问题讨论】:

  • 但是有成本!更多代码。到处都是重复的错误。每次都略有不同的设计选择。如果只想存储两个值,std::pair 有什么问题?如果你有一个类型,有一些含义,还有一些成员函数,恰好有两个数据成员,很好,写你自己的class。但是对于一对对象,为什么不叫它pair呢?
  • 我发现了这个相关问题:stackoverflow.com/questions/2236182/…。这仍然不足以让我使用std::pair。但我想这是个人品味的问题。
  • @Rémi:这个问题可以概括为std::tuple
  • 另一个类似的问题:stackoverflow.com/questions/3607352/…。我仍然不相信 std::pair 可能有用的任何答案。

标签: c++ coding-style std-pair


【解决方案1】:

当我需要包含 2 个或更多对象的本地包时,我通常使用对(和元组)。

主要用例是函数的返回类型:C++ 不允许返回多个值,但允许返回具有多个字段的结构。我更喜欢使用一对或元组,而不是使用输出参数。

第二个用例是元素的临时存储;例如自动生成operator< for

struct A { int a; int b; int c; };

你可以这样写operator<

bool operator<(A const& left, A const& right) {
    return std::tie(left.a , left.b , left.c )
         < std::tie(right.a, right.b, right.c);
}

它会自动生成正确的字典顺序(很多人搞砸了这些运算符...)。

【讨论】:

  • 谢谢。这与我的问题并没有真正的关系,但我很高兴得知 std::tie 存在。现成的operator&lt; 可能确实有用。在使用firstsecond 不会影响可读性的情况下,使用一对可能会很方便。但我真的很讨厌在地图上使用firstsecond
  • 这适用于许多样板方法:添加 make_tie 方法将 = == &lt;swap 减少到 O(1) 代码,并隔离 @987654336 中的错误@它们可以是通用的,而不是隐藏在角落里。
  • @Rémi:哦,我绝对同意你关于map的观点;这里.key.value 会好很多!
猜你喜欢
  • 2011-02-21
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 2011-08-07
相关资源
最近更新 更多