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

ThR*_*R37 23 c++ struct std-pair

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

亲爱的大家,

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

typedef std::pair<int,double> myElem;
Run Code Online (Sandbox Code Playgroud)

或者a

typedef struct {
    int label;
    double value;
} myElem;
Run Code Online (Sandbox Code Playgroud)

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

但是,我猜使用pair有一个优势.它更高效还是其他什么?

Mat*_* M. 17

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

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

struct MyElement
{
  int label;
  double value;
};
Run Code Online (Sandbox Code Playgroud)

我是强打字的坚定支持者,而且我更喜欢"真正的"结构(更好的是,类),而不是一个特殊的元组,只要它不仅仅是一个短暂的东西.

主要是因为:

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

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


dir*_*tly 6

A pair以模板形式实现struct.它为您提供了创建(通常是异质的)对的简写.此外,对于可以使用的类型有一些限制pair:

类型要求

T1和T2必须都是可分配的模型.其他操作还有其他要求.只有当T1和T2都是DefaultConstructible时,才能使用Pair的默认构造函数,如果T1和T2都是EqualityComparable,则只能使用operator ==,而只有T1和T2都是LessThanComparable时才可以使用operator <.

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

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

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


Jer*_*fin 6

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

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

很难想象有意义的标签会适用于这两种标签,所以他们选择了一对并不是很重要的标签,但至少没有误导.使用"键"和"数据"将工作std::map,但会产生误导的std::equal_range(如果你切换到像lower_boundupper_bound使他们更有意义std::equal_range,这将会是同样的错误在项目std::map).

  • 只是我的意见,但我不喜欢他们做出的选择.地图条目应该是(键,值),范围应该是(开始,结束).现在,我们不得不在两种情况下都使用无意义和误导(第一,第二).改变字段名称很困难而且不是惯用语. (5认同)

sbi*_*sbi 5

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

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

所以我通常按照你的推理做:struct具有专用成员名称的a比firstand更容易阅读second