为什么我们没有用于地图的哈希和捕食函子?



unordered_map的情况下,每当我们使用user-defined键时,我们都会定义hashpred函子。

地图的模板语法如下:

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;

在映射的情况下,没有hashpred函子选项。万一map我们永远不会发生碰撞.如果发生冲突,那么为什么我们没有像unordered_map那样hashpred函子呢? 我在这里错过了什么吗?

std::mapstd::unordered_map是两种不同类型的容器,都提供键值对映射。 他们如何做到这一点是完全不同的。

std::map使用树结构来实现。 通常这是一个RBTree,但任何可以保证最坏情况O(logN)操作的树都可以工作。 这意味着它只需要为键类型提供一个比较运算符,因为您可以获得总排序并使用实现严格弱排序的比较器检查相等性。 这意味着您永远不会发生哈希冲突,因为您没有使用哈希。

std::unordered_map基于哈希表实现。 由于它对密钥进行哈希处理,因此您需要一个哈希运算符。 您还需要一个比较运算符,因为两个值可以哈希为相同的值(哈希冲突(。 如果没有比较运算符,您将无法判断重复哈希是否真的是重复项。

std::map

不是哈希表,因此不使用哈希函数。相反,它需要operator<对映射中包含的值进行排序。

相关内容

  • 没有找到相关文章

最新更新