理解作为Java开发人员在C ++中的Map

时间:2014-01-14 17:33:56

标签: java c++ map equals hashcode

在Java中,我们得到了hashCode()和equals()等方法,地图使用这些方法来识别每个对象。 C ++没有这样的基本方法,每个对象都默认实现。

地图现在如何使用自定义对象作为键值?

编辑:没有重复,因为它特别针对那些特定于Java的接口方法,以前没有用C ++做过的人会寻找

6 个答案:

答案 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-safeconcurrent,而TreeMap则不是。 CSLM在JDK 1.6中添加

参见文档:Java equivalent of C++ std::map?

答案 4 :(得分:2)

std :: map是一个模板化的类。关键必须匹配一个称为严格弱排序的特定概念,以保证:

  • 密钥不具有可比性(重载运算符&lt;或为地图提供自定义比较器)
  • 如果元素A小于B,则B不能小于A
  • 如果元素A小于B且B小于C,则A小于C

以下是自定义类型作为键的示例:

#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 ++中可以被类重载。替代地图可以使用不同的表达方式。