假设一个类有多个与对象顺序相关的成员,例如,A { T1 x; T2 y; };
。
标准执行情况operator<
我知道是
bool A::operator<(const A& a) {
return x < a.x || (x == a.x && y < a.y);
}
但这对我来说看起来效率非常低,尤其是当T1
is std::vector
。 (当成员较多时,读取和维护的效率就更低了。)
有没有一个“标准”C++-way有效地比较事物?还是每个人都像这样走自己的路:
enum Cmp = {LESS,EQUAL,GREATER}
Cmp A::CompareTo(const A& a) {
const Cmp c1 = x.CompareTo(a.x);
if (c1 != EQUAL) return c1;
const Cmp c2 = y.CompareTo(a.y);
return c2;
}
And for std::vector
也许有人会用std::mismatch
来实施这样一个CompareTo
?
(我确信这不是一个新问题,但是operator<
是一个糟糕的搜索词。)
如果您的类型有两个(或更多)成员,则应比较它们按字典顺序,您通常已经在头脑中确定了应该比较成员的顺序(即它们的“优先级”,例如首先是“姓氏”,然后是“名字”,用于对地址列表中的人员进行排序)。
然后,在您找到成员的“有效”订单后(在这里,我们说x
and y
),要按字典顺序比较两个对象,请使用tuple构造有std::tie
,可以轻松扩展到两个以上的成员。并请以非会员身份超载操作员。
bool operator<(const A& a, const A& b) {
return std::tie(a.x, a.y)
< std::tie(b.x, b.y);
}
如果您无法使用 C++11 之前的编译器(或不支持元组的编译器),则可以使用 boost 的等效项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)