如何为聚合结构实现C ++(in)相等运算符?

时间:2011-02-14 11:30:33

标签: c++ operators operator-overloading equality

有时我会有这样的结构 -

struct aggregate1 {
  std::string name;
  std::vector<ValueT> options;
  size_t foobar;
  // ...
};

- 其中(in)等式简单地定义为(in)所有成员的相等:lhs_name == rhs_name && lhs_options == rhs_options && lhs_foobar == rhs_foobar

实施此方法的“最佳”方法是什么? (最佳:(运行时)效率,可维护性,可读性)

  • operator==operator!=
  • 而言
  • operator!=operator==
  • 而言
  • ==!=
  • 的单独实施
  • 作为会员或免费功能?

请注意,此问题仅与(in)平等操作有关,因为比较(<<=,...)对此类聚合没有太大意义。

4 个答案:

答案 0 :(得分:8)

我会这样做,但可能会将operator == definition移动到cpp文件。离开operator!=要内联

请记住比较最有可能不同的成员变量,以便其余变量短路并且性能更好。

struct aggregate1 {
  bool operator==(const aggregate1& rhs) const
  {
     return (name == rhs.name)
     && (options == rhs.options)
     && (foobar == rhs.foobar);
  }
  bool operator!=(const aggregate1& rhs) const
  {
    return !operator==(rhs);
  }

  std::string name;
  std::vector<ValueT> options;
  size_t foobar;

  // ...
};

答案 1 :(得分:6)

会员或自由功能是一个品味问题,编写==!=的单独实现在我看来很无聊,容易出错(你可能会忘记两个运营商中只有一个的成员,并且需要时间注意)而不在效率方面添加任何内容(调用其他运算符并应用!的成本可以忽略不计)。

决定仅限于“以operator==或相反的方式实施operator!=是否更好?

在我看来,在可维护性/可读性/效率方面,它是一样的;为了保持一致性,我只建议在任何地方以相同的方式进行。你想要更喜欢使用一个或另一个作为“基本运算符”的唯一情况是当你知道,在你的结构中包含的类型中,该运算符比它的否定更快,但我不知道何时会发生这种情况。

答案 2 :(得分:1)

恕我直言,作为朋友实现并实现operator==(例如,一些STL算法将依赖于此),operator!=应该实现为等于运算符的否定。

答案 3 :(得分:-1)

( - :自答案: - )

我想强调聚合WRT 效率的一个方面:

op==op!=的评估顺序与(平均)效果无关。

假设现在单独实现并且给定两个极值(a-eq)所有子元素相等且(b-neq)所有子元素不相等,我们有这些情况:

  • (a-eq)+ operator==:需要比较所有子元素才能返回true
  • (a-eq)+ operator!=:需要比较所有子元素才能返回false
  • (b-neq)+ operator==:确定第一个子元素不等后返回false
  • (b-neq)+ operator!=:确定第一个子元素不等后返回true

由于平均表现方式相同 - 至少在我看来 - 在op!=方面实施op==更为自然,因为我觉得实施平等操作。