在 std::map
的自定义类中实现比较运算符时,我遇到了这个问题,但看不到任何被问到的地方。
除了上述问题,也有兴趣简要了解,如何operator<
适用于 std::map
.
问题来源:
struct Address {
long m_IPv4Address;
bool isTCP;
bool operator< (const Address&) const; // trouble
};
最佳答案
std::map<K,D>
需要能够排序。默认情况下使用 std::less<K>
, 对于非指针使用 <
1。
使用您对用户的要求最少的规则,它从 <
综合“等价”当它需要它时(!(a<b) && !(b<a)
表示 a
和 b
是等价的,即两者都不小于另一个)。
这使得编写用作 map
的关键组件的类变得更加容易,这似乎是个好主意。
有std
使用 ==
的容器例如 std::unordered_map
,它使用 std::hash
和 ==
.同样,它们的设计使它们对用户的要求最少——您不需要对 unordered_
进行完整的订购。容器,只是等价和好的hash
.
碰巧,写一个<
真的很容易如果您有权访问 <tuple>
.
struct Address {
long m_IPv4Address;
bool isTCP;
bool operator< (const Address& o) const {
return
std::tie( m_IPv4Address, isTCP )
< std::tie( o.m_IPv4Address, o.isTCP );
}
};
它使用 std::tie
在 <tuple>
中定义生成一个合适的 <
为你。 std::tie
获取一堆数据,并生成一个 tuple
的引用资料,其中有一个很好的<
已经定义。
1 对于指针,它使用一些与 <
兼容的比较其中 <
指定了行为,并且在 <
时表现良好才不是。这只对分段内存模型和其他晦涩的架构很重要。
关于c++ - 为什么 C++ STL 容器使用 "less than"operator< 而不是 "equal equal"operator== 作为比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153303/