对于unordered_map
,我们在使用hash
键时定义pred
和user-defined
仿函数。
地图的模板语法如下:
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
对于地图,没有hash
和pred
仿函数选项。在map
的情况下,我们永远不会发生冲突。如果发生冲突,那为什么不像hash
那样拥有pred
和unordered_map
仿函数?
我在这里想念东西吗?
答案 0 :(得分:5)
std::map
不是哈希表,因此不使用哈希函数。相反,它需要operator<
才能对地图中包含的值进行排序。
答案 1 :(得分:5)
std::map
和std::unordered_map
是两种都提供键值对映射的容器的不同类型。他们的操作方式完全不同。
std::map
使用树结构来实现。通常,这是一个RBTree,但是任何可以保证最坏情况的O(logN)
操作都可以使用的树。这意味着它仅需要键类型的比较运算符,因为您可以获得总排序并与实现严格弱排序的比较器检查是否相等。这意味着您将永远不会发生哈希冲突,因为您没有使用哈希。
std::unordered_map
基于哈希表实现。由于它对密钥进行哈希处理,因此需要一个哈希运算符。您还需要一个比较运算符,因为两个值可能会哈希为相同的值(哈希冲突)。没有比较运算符,您将无法判断重复的哈希是否真的是重复的项目。