地图现在如何使用自定义对象作为键值?
编辑:没有重复,因为它特别针对那些特定于Java的接口方法,以前没有用C ++做过的人会寻找
答案 0 :(得分:7)
首先,C ++中的std::map
通常是红黑树,而不是哈希表。 C ++ 11中还有一个名为std::unordered_map
的哈希映射。默认情况下,它使用operator<
来比较元素。您还可以插入自定义比较器,可以使用您想要的任何内容进行比较。这是通过使用std::map
的可选第3个模板参数来完成的。
答案 1 :(得分:6)
C ++ std::map
是一个有序映射,其要求意味着它是作为自平衡二进制搜索树(通常是红黑树)实现的。这意味着密钥类型必须具有某种strict weak ordering,它可以是less-than
运算符的形式,也可以是用户定义的比较函数。
有很多关于如何使用std::map
用户定义类型作为键的SO帖子(请参阅one example here)。
C ++ 11有std::unordered_map
,这是一个对密钥类型有不同要求的哈希表(具体来说,需要哈希函数和相等比较)
答案 2 :(得分:2)
C ++中的Map不是HashMap,而是一个有序的映射(通常实现为红黑树)。使用比较器功能按键对条目进行排序。在默认实现中,键必须重载operator<
,但您可以指定自己的比较器函数。
请参阅此处获取C ++地图信息:http://en.cppreference.com/w/cpp/container/map
答案 3 :(得分:2)
Java的哈希映射的时间复杂度为O(1)。在C ++中,基于红黑树的映射具有O(logN)的时间复杂度。
CSLM为hread-safe
,concurrent
,而TreeMap
则不是。
CSLM在JDK 1.6中添加
答案 4 :(得分:2)
std :: map是一个模板化的类。关键必须匹配一个称为严格弱排序的特定概念,以保证:
以下是自定义类型作为键的示例:
#include <map>
#include <iostream>
struct Custom{ Custom(int c): c(c){} int c; };
bool operator< (Custom const &a, Custom const &b){ return a.c< b.c; }
int main(){ std::map<Custom, int> m; m[Custom(42)]= 42; std::cout<< m[Custom(42)]; }
也就是说,std :: map与Java的哈希映射不完全等价。 C ++ 11有std::unordered_map
。使用unordered_map
,您可以为自己的类型定义自己的std :: hash模板,以将自定义类型保留为哈希键。
答案 5 :(得分:1)
C ++ map是一个有序的映射,而不是一个哈希映射,模板化使用布尔表达式comp(a,b)来比较键值。执行(A&lt; B)比较的默认值是less,它在C ++中可以被类重载。替代地图可以使用不同的表达方式。