在Java中,我们有像hashCode()和equals()这样的方法,它们被用于由map来识别每个对象。C++没有这样基本的方法,每个对象默认都要实现。
那么,如何让map使用自定义对象作为键值呢?
编辑:没有重复,因为它特别针对那些Java特定接口方法,一个以前从未使用过C++的人会寻找这些方法。
那么,如何让map使用自定义对象作为键值呢?
编辑:没有重复,因为它特别针对那些Java特定接口方法,一个以前从未使用过C++的人会寻找这些方法。
首先,C++中的std::map
通常是红黑树,而不是哈希表。还有一种叫做std::unordered_map
的哈希表出现在C++11中。默认情况下,它使用operator<
来比较元素。你也可以插入自定义的比较器,用任何你想要的方法进行比较。这可以通过使用std::map
的可选第三个模板参数来完成。
C++中的Map不是HashMap,而是有序映射(通常实现为红黑树)。条目按键使用比较函数排序。在默认实现中,键必须重载operator<
,但您可以指定自己的比较函数。
点击此处查看C++ map信息:http://en.cppreference.com/w/cpp/container/map
std::map是一个模板类。键必须匹配一个叫做严格弱序的概念,它保证:
以下是使用自定义类型作为键的示例:
#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模板,以将自定义类型持久化为哈希键。