31

可能重复:
使用具有两个字段和一对的结构有什么区别?

亲爱的大家,

我对pairs和struct有一个小问题。使用 std::pair 而不是具有两个单元格的结构有什么好处吗?我使用pairs 有一段时间了,但主要问题是可读性:如果你想表示例如一个双重(int“标签”,双重“值”),你可以使用:

typedef std::pair<int,double> myElem;

或一个

typedef struct {
    int label;
    double value;
} myElem;

如果您的语句具有“语义”意义,则代码变得更具可读性(您将始终知道 x.label 是什么。x.first 不是这种情况)。

但是,我想使用pair有一个优势。是性能更高还是其他?

4

5 回答 5

28

在性能方面:它不太可能改变任何东西,你只是给它涂糖衣。

在可用性方面,我宁愿使用自定义结构,可以这样声明(顺便说一句):

struct MyElement
{
  int label;
  double value;
};

我是强类型的坚定支持者,我更喜欢“真正的”结构(更好的是,类)而不是临时元组,只要它不仅仅是转瞬即逝的东西。

主要是因为:

  • 正如你所指出first的,second没有多大意义
  • 您不能将方法/其他字段添加到std::pair
  • 您不能将类不变量添加到std::pair

总而言之,我真的认为维护受益于使用定制的专用结构,一个尺寸适合他们所有人的元组。

于 2010-08-31T09:31:13.650 回答
9

Apair被实现为模板化的struct. 它为您提供了创建(通常是异构的)对的简写。此外,可以与 a 一起使用的类型有一些限制pair

类型要求

T1 和 T2 必须都是 Assignable 的模型。额外的操作有额外的要求。只有当 T1 和 T2 都是 DefaultConstructible 时才可以使用 Pair 的默认构造函数,只有当 T1 和 T2 都是 EqualityComparable 时才可以使用 operator==,并且只有当 T1 和 T2 都是 LessThanComparable 时才可以使用 operator<。

(来自 SGI STLstd::pair文档)

如果类型不遵循任何这些约束或者您不关心它们,定义您自己的 POD 可能是有意义的。

最后,我想这是个人选择/编码风格的问题。

于 2010-08-31T08:43:57.380 回答
7

它的主要优点是它是通用的。例如,当您从 中检索某些内容时std::map,您将获得键和关联值作为 中的第一项和第二项std::pair

同样,当您使用std::equal_range在集合中查找一组相等的值时,您将迭代器获取到范围的开头和结尾,作为std::pair.

很难想象适用于这两者的有意义的标签,所以他们选择了一对意义不大但至少不会误导的夫妇。使用 'key' 和 'data' 将适用于std::map,但会误导std::equal_range(如果您切换到类似的东西lower_bound并使upper_bound它们对 更有意义std::equal_range,那么对于 中的项目同样是错误的std::map)。

于 2010-08-31T08:45:30.443 回答
5

但是,我想使用pair有一个优势。是性能更高还是其他?

我对此表示怀疑,毕竟实例化std::pair只是一个。不过,带有定义。但是对于只有两个成员的人来说,这应该不会太难。structstd::pairoperator<struct

所以我通常按照你的推理去做:带有专用成员名称的 a 比andstruct更容易阅读。firstsecond

于 2010-08-31T08:43:00.513 回答
4

通过 std::pair,您可以自由使用 STL 中的函子,例如 select1st 或 select2nd。同样,它允许您将其他通用函数与您的配对一起使用,例如 operator< 和其他。诚然,随着 boost/tr1 的出现,您可以通过使用 bind 来实现几乎相同的效果。

不过,您关于可读性的观点是非常正确的。

于 2010-08-31T08:45:21.230 回答