有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在C++中理解映射作为java开发者

在Java中,我们有hashCode()和equals()等方法,映射使用这些方法来标识每个对象。C++没有这样的基本方法,每个对象都默认执行。p>

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

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

共 (6) 个答案

  1. # 1 楼答案

    C++映射是一个有序映射,而不是哈希映射,它是用布尔表达式COMP(A,B)来比较关键值的。默认值是执行(A& lt;b)比较的更少,比较在C++中可以被类重载。备用贴图可以使用不同的表达式

  2. # 2 楼答案

    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模板,以将自定义类型持久化为哈希键

  3. # 3 楼答案

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

    这里参见C++映射信息:http://en.cppreference.com/w/cpp/container/map

  4. # 4 楼答案

    C++ +{CD1>}是一个有序映射,其要求意味着它被实现为一个自平衡二叉搜索树(通常是红黑树)。这意味着键类型必须具有某种类型的strict weak ordering,可以是less-than运算符的形式,也可以是用户定义的比较函子

    关于如何使用带有用户定义类型的std::map作为键(参见one example here),有很多SO帖子

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

  5. # 5 楼答案

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

    CSLM是hread-safeconcurrentTreeMap不是。 在JDK1.6中添加了CSLM

    见文件:Java equivalent of C++ std::map?

  6. # 6 楼答案

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