实现运算符<在 C++
我有一个带有一些数字字段的类,例如:
class Class1 {
int a;
int b;
int c;
public:
// constructor and so on...
bool operator<(const Class1& other) const;
};
我需要使用此类的对象作为 std::map
中的键。因此我实现了operator<
。此处使用的 operator<
最简单的实现是什么?
编辑:
只要任何字段不相等,就可以假定<
的含义以保证唯一性。
编辑2:
一个简单的实现:
bool Class1::operator<(const Class1& other) const {
if(a < other.a) return true;
if(a > other.a) return false;
if(b < other.b) return true;
if(b > other.b) return false;
if(c < other.c) return true;
if(c > other.c) return false;
return false;
}
这篇文章背后的全部原因只是我发现上面的实现太冗长了。应该有更简单的东西。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我假设你想实现字典顺序。
C++11 之前:
C++11 之后:
I assume you want to implement lexicographical ordering.
Prior to C++11:
Since C++11:
我认为对
map
的要求存在误解。map
不要求您的类定义operator<
。它需要传递合适的比较谓词,该谓词默认为std::less
,它在Key
上使用operator<
。您不应该实现
operator<
来适应map
中的密钥。仅当您为此类定义它时才应该实现它:即如果它有意义。您可以完美地定义一个谓词:
然后:
I think there is a misunderstanding on what
map
requires.map
does not require your class to haveoperator<
defined. It requires a suitable comparison predicate to be passed, which conveniently defaults tostd::less<Key>
which usesoperator<
on theKey
.You should not implement
operator<
to fit your key in themap
. You should implement it only if you to define it for this class: ie if it's meaningful.You could perfectly define a predicate:
And then:
这取决于订购对您是否重要。如果没有,你可以这样做:
It depends on if the ordering is important to you in any way. If not, you could just do this:
避免多重缩进的版本是
作者的“Edit 2”版本,平均比该解决方案有更多的比较。 (最坏情况 6 到最坏情况 3)
A version which avoids multiple indentation is
The "Edit 2" version of the author has on average more comparisons than this solution. (worst case 6 to worst case 3)
你可以这样做:
但这有很多警告 - 例如没有 vtbl,我确信还有更多。
You could do:
but that has quite a lot of of caveats - no vtbl for example and plenty more I'm sure.