在std::map
的自定义类中实现比较运算符时,我遇到了这个问题,无法看到任何问题。
除上述问题外,还有兴趣简要了解operator<
对std::map
的作用。
问题的根源:
struct Address {
long m_IPv4Address;
bool isTCP;
bool operator< (const Address&) const; // trouble
};
答案 0 :(得分:5)
因为std::map
是一个已排序关联容器,所以它的键需要排序。
==
运营商不允许订购多个密钥
您可能正在寻找std::unordered_map
,哪些作品有哈希表。您可以指定自己的哈希和相等运算符函数:
explicit unordered_map( size_type bucket_count,
const Hash& hash = Hash(),
const KeyEqual& equal = KeyEqual(),
const Allocator& alloc = Allocator() );
答案 1 :(得分:5)
std::map<K,D>
需要能够排序。默认情况下使用std::less<K>
,非指针使用<
1 。
使用您向用户提出的最少要求的规则,它会综合&#34;等价&#34;来自<
时需要它!(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 对于指针,它使用一些与指定<
行为的<
兼容的比较,并且在<
没有指定时表现良好。这仅对分段存储模型和其他模糊架构非常重要。
答案 2 :(得分:2)
使用<
您可以订购元素。如果a < b
,那么a
应放在集合中的b
之前。
您还可以确定两个项目是否相同:如果!(a < b) && !(b < a)
(如果两个对象都不小于另一个),则它们是等效的。
这两项功能都需要std::map
。所以它只是期望它的元素类型提供一个运算符<
。
使用==
您可以确定相等,但您无法订购元素。所以它不能满足std::map
的要求。