iam*_*ind 4 c++ operator-overloading map comparator
在自定义类中实现比较器运算符时std::map,我遇到了这个问题,无法看到任何问题.
除了上述问题,还有兴趣简要了解一下,如何operator<工作std::map.
问题的起源:
struct Address {
long m_IPv4Address;
bool isTCP;
bool operator< (const Address&) const; // trouble
};
Run Code Online (Sandbox Code Playgroud)
因为std::map是一个有序的关联容器,它的键需要排序.
一个==运营商不会允许订购多个密钥
您可能正在寻找std::unordered_map,哪个工作有哈希表.您可以指定自己的哈希和相等运算符函数:
explicit unordered_map( size_type bucket_count,
const Hash& hash = Hash(),
const KeyEqual& equal = KeyEqual(),
const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)
std::map<K,D>需要能够排序。默认情况下是use 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 );
}
};
Run Code Online (Sandbox Code Playgroud)
使用std::tie定义为您<tuple>生成合适<的商品。 std::tie接收一堆数据,并生成一个已经定义tuple好的引用<。
1对于指针,它使用一些与指定行为兼容的比较,而<在<未指定行为的情况下表现良好<。这仅对分段内存模型和其他晦涩的架构真正重要。