有时我会有这样的结构 -
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)平等操作有关,因为比较(<
,<=
,...)对此类聚合没有太大意义。
答案 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)所有子元素不相等,我们有这些情况:
operator==
:需要比较所有子元素才能返回true operator!=
:需要比较所有子元素才能返回false operator==
:确定第一个子元素不等后返回false operator!=
:确定第一个子元素不等后返回true 由于平均表现方式相同 - 至少在我看来 - 在op!=
方面实施op==
更为自然,因为我觉得实施平等操作。