作为 Java 开发人员,了解 C++ 中的 Map

Understanding Map in C++ as a Java developer

本文关键字:了解 C++ 中的 Map Java 开发 作为      更新时间:2023-10-16

在Java中,我们有像hashCode()和equals()这样的方法,映射使用它们来识别每个对象。C++没有这样的基本方法,默认情况下每个对象都会实现。

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

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

首先,C++中的std::map通常是一棵红色的黑色树,而不是哈希表。C++11 中还有一个名为 std::unordered_map 的哈希映射。默认情况下,它使用 operator< 来比较元素。您还可以插入一个自定义比较器,该比较器可以使用您想要的任何内容进行比较。这是通过使用可选的第三个模板参数来std::map 来完成的。

C++ std::map是一个

有序映射,其要求意味着它是作为自平衡二叉搜索树(通常是红黑树)实现的。这意味着键类型必须具有某种严格的弱排序,它可以以less-than运算符的形式出现,也可以作为用户定义的比较函子出现。

有很多关于如何使用用户定义类型作为键的std::map的 SO 帖子(请参阅此处的示例)。

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

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

有关C++地图信息,请参见此处:http://en.cppreference.com/w/cpp/container/map

std::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 模板,以将自定义类型保留为哈希键。

Java的哈希映射的时间复杂度为O(1)。C++,基于红黑树的地图具有O(logN)的时间复杂度。

CSLM是hread-safeconcurrent TreeMap不是。CSLM 已添加到 JDK 1.6 中

参见 Docs:Java 相当于 C++ std::map?

C++ map 是一个有序映射,而不是哈希映射,模板化为使用布尔表达式 comp(a,b) 来比较键值。默认值为 less,它执行 (A