作为一名Java开发者,了解C++中的Map容器

7
在Java中,我们有像hashCode()和equals()这样的方法,它们被用于由map来识别每个对象。C++没有这样基本的方法,每个对象默认都要实现。
那么,如何让map使用自定义对象作为键值呢?
编辑:没有重复,因为它特别针对那些Java特定接口方法,一个以前从未使用过C++的人会寻找这些方法。
6个回答

7

首先,C++中的std::map通常是红黑树,而不是哈希表。还有一种叫做std::unordered_map的哈希表出现在C++11中。默认情况下,它使用operator<来比较元素。你也可以插入自定义的比较器,用任何你想要的方法进行比较。这可以通过使用std::map的可选第三个模板参数来完成。


6

C++中的std::map是一种有序映射,它有特定的要求,这意味着它被实现为自平衡二叉搜索树(通常是红黑树)。这意味着键类型必须具有某种严格弱序关系,可以采用less-than运算符或用户定义的比较函数。

有很多SO帖子介绍如何使用自定义类型作为std::map的键(请参见此处的一个示例)。

C++11有std::unordered_map,它是一种哈希表,对键类型有不同的要求(具体来说,需要哈希函数和相等比较)。


2

C++中的Map不是HashMap,而是有序映射(通常实现为红黑树)。条目按键使用比较函数排序。在默认实现中,键必须重载operator<,但您可以指定自己的比较函数。

点击此处查看C++ map信息:http://en.cppreference.com/w/cpp/container/map


2
Java的哈希映射具有O(1)的时间复杂度。在C++中,基于红黑树的映射具有O(logN)的时间复杂度。
CSLM是线程安全的,并且支持并发操作,而TreeMap则不支持。 CSLM是在JDK 1.6中添加的。
请参阅文档:Java equivalent of C++ std::map?

2

std::map是一个模板类。键必须匹配一个叫做严格弱序的概念,它保证:

  • 键可以进行小于比较(重载operator<或给map提供自定义比较器)
  • 如果元素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模板,以将自定义类型持久化为哈希键。


1
C++ map是有序映射,不是哈希映射,模板化使用布尔表达式comp(a,b)来比较键值。默认为less,执行(A < B)比较,在C++中可以被类重载。备选映射可以使用不同的表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接