std::map,自定义比较器的设计约束
std::map, custom comparator's design constraints
我一直在尝试为std::map容器定义一个自定义比较器。
问题是:我能在==和!=上中继吗运算符还是会打破严格的弱秩序?我是否被迫使用运算符<
(一个和两个类确实有运算符!=和运算符==定义正确)
typedef std::pair<One, Two> MapKey_t;
class cmp
{
bool operator()(const MapKey_t& left, const MapKey_t& right) const
{ return left.first != right.first && right.first == right.second; }
}
typedef std::map<MapKey_t, Three*, cmp> MyMap_t;
由于左右切换不会改变比较器的返回值,这会起作用吗?
我真的不在乎如何将项目排序到容器中,但我不希望重复成为其中的一部分。
更新:
我可以使用内存地址来获得严格的弱排序吗?
class cmp
{
bool operator()(const MapKey_t& left, const MapKey_t& right) const
{
if(left.first == right.first)
if(left.second != right.second)
return false; // This represents for me, functionally, a duplicate
else
// Can't use operator < there since left.second equals right.second but
// functionally for me, this is not a duplicate and should be stored
// what about memory address strict weak ordering ?
return &left < &right;
else
return left.first < right.first; // There I can use operator <
}
不能依赖自洽的等于或不等于,因为它们不能建立严格的弱排序。如果切换左右参数,则比较器返回值应发生更改。地图必须能够建立元素的顺序,而不仅仅是能够区分两个元素是否相等。
非常重要的是,如果A < B
为真,那么B < A
为假。此外,如果A < B
和B < C
都为真,则A < C
也为真。
如果你不想或不能为你的类型建立严格的弱排序,那么,你可以使用一个不需要的映射:std::unordered_map
1,这是一个哈希映射。但是,这需要您提供一个散列函数和一个相等性比较。它还要求编译器支持C++11。
1
正如@JohnDining在评论中指出的,std::unordered_map
不幸被命名。它应该是std::hash_map
,但显然这个名称可能与其他库中的hash_maps
冲突。在任何情况下,目的都不是要有一个没有顺序的映射,而是要有一张具有恒定时间查找的映射
您可能不关心事物在映射中的顺序,但映射确实关心。上面提供的代码似乎没有正确实现严格的弱排序。正如您已经注意到的,在所有情况下,以左换右不会改变operator()
的结果,您的函数并没有实现严格的弱排序。
您不必直接根据operator<
来实现比较器,但必须确保如果operator()(A,B)
返回true
,那么operator()(B,A)
也不会返回true
。
这是不可接受的,字符串弱排序意味着A < B
和B < A
不应同时为真。std::map
依赖于此来建立密钥的排序和相等性
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 对没有比较器或λ函数的向量进行排序?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 用户定义的结构是否有默认C++比较器?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 使用迭代器的自定义比较器函数
- C++对λ比较器EXC_BAD_ACCESS进行排序
- std::map,自定义比较器的设计约束
- 数据结构受比较器约束