作为 Java 开发人员,了解 C++ 中的 Map
Understanding Map in C++ as a Java developer
在Java中,我们有像hashCode()和equals()这样的方法,映射使用它们来识别每个对象。C++没有这样的基本方法,默认情况下每个对象都会实现。
映射现在如何使用自定义对象作为键值?
编辑:没有重复,因为它特别针对那些特定于java的接口方法,以前没有做过C++的人会寻找
首先,C++中的std::map
通常是一棵红色的黑色树,而不是哈希表。C++11 中还有一个名为 std::unordered_map
的哈希映射。默认情况下,它使用 operator<
来比较元素。您还可以插入一个自定义比较器,该比较器可以使用您想要的任何内容进行比较。这是通过使用可选的第三个模板参数来std::map
来完成的。
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-safe
,concurrent
TreeMap
不是。CSLM 已添加到 JDK 1.6 中
参见 Docs:Java 相当于 C++ std::map?
C++ map 是一个有序映射,而不是哈希映射,模板化为使用布尔表达式 comp(a,b) 来比较键值。默认值为 less,它执行 (A
- 正在尝试了解输入验证循环
- 了解 GLM- openGL 中的相机转换
- C++我需要了解在哪里使用指针和双指针
- 如何深入了解明显的腐败
- 了解嵌套循环打印星号图案
- 了解每月第一天函数的代码
- 了解C++标准::shared_ptr
- 尝试了解在导入的静态方法上使用删除方法时的错误
- C++:需要帮助了解运算符重载错误
- 在学习数据结构之前对STL有一个了解是好的吗?
- 了解算法的性能差异(如果以不同的编程语言实现)
- 了解删除C++
- 了解内存序列和标准::memory_order_relaxed
- 了解其工作原理
- 准确了解对象在内存中的映射方式
- 了解C++如何返回引用并绑定到引用
- 了解提升执行器示例
- 了解运算符重载和迭代器,为什么它会打印出"wrhrwwr"?
- 了解是否接受套接字
- 了解布尔运算符==(参数 1,参数 2)