结构有2个单元格vs std :: pair?

时间:2010-08-31 08:36:15

标签: c++ struct std-pair

  

可能重复:
  What is the difference between using a struct with two fields and a pair?

亲爱的,

我对关于对和结构有一点疑问。使用std :: pair而不是带有两个单元格的结构有什么好处吗? 我已经使用了一段时间,但主要问题是可读性: 如果你想表示例如duple(int“label”,double“value”),你可以使用a:

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

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

如果你的语句具有“语义”意义,那么代码就会变得更具可读性(你将永远知道x.label是什么。这与x.first的情况不同。)

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

5 个答案:

答案 0 :(得分:16)

就性能而言:它不太可能改变任何东西,你只需涂糖。

在可用性方面,我宁愿使用自定义结构,可以通过这种方式声明(顺便说一下):

struct MyElement
{
  int label;
  double value;
};

我强烈支持强类型,而且我更喜欢“真正的”结构(更好的是,类),而不是一个特殊的元组,只要它不仅仅是一个短暂的东西。

主要是因为:

  • 正如您所指出的那样firstsecond没有多大含义
  • 您无法将方法/其他字段添加到std::pair
  • 您无法将类不变量添加到std::pair

总而言之,我真的认为维护可以从使用一个适合所有元组的自定义专用结构中获益。

答案 1 :(得分:6)

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

同样,当您使用std::equal_range在集合中查找一组相等的值时,您将获得作为std::pair中第一项和第二项的范围的开头和结尾的迭代器。 / p>

很难想象有意义的标签会适用于这两种标签,所以他们选择了一对并不意味着很多的标签,但至少没有误导。使用“密钥”和“数据”适用于std::map,但会误导std::equal_range(如果您切换到lower_boundupper_bound之类的内容,则会更有意义对于std::equal_rangestd::map)中的项目同样错误。

答案 2 :(得分:5)

pair实现为模板struct。它为您提供了创建(通常是异质的)对的简写。此外,对pair

使用的类型有一些限制
  

类型要求

     

T1和T2都必须   是可分配的模型。额外   操作有额外的   要求。配对的默认值   只有两者都可以使用构造函数   T1和T2是DefaultConstructible,   operator ==仅在T1和T1都可以使用   和T2是EqualityComparable,和   运营商LT;只有两个T1都可以使用   和T2是LessThanComparable。

(来自SGI STL std::pair文件)

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

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

答案 3 :(得分:4)

  

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

我对此表示怀疑,毕竟实例化的std::pair只是structstd::pair附带了operator<。但对于仅有两名成员的struct来说,这不应该太难。

因此,我通常按照您的推理执行操作:具有专用成员名称的structfirstsecond更易于阅读。

答案 4 :(得分:3)

使用std :: pair,您可以自由地使用STL中的仿函数,例如select1st或select2nd。同样,它允许您使用其他通用函数,例如运算符&lt;和别的。不可否认,随着boost / tr1的出现,你可以通过使用bind实现相同的效果。

关于可读性的观点非常正确。