固定大小的unordered_map,如何定义

fixed size unordered_map, how to define?

本文关键字:何定义 定义 map unordered      更新时间:2023-10-16

是否可以定义固定大小的unordered_map ?

看成员函数,没有类似于std::vectorstd::listresize()。而且,google也没帮我。

是的,这是可能的,但在STL中没有这样的映射。您可以做的是编写包含std::array< std::pair<Key, Value>, N>的自己的类,并使用std::hash自己提供find(), insert()的大部分功能。如果您使用std::vector< std::pair<Key, Value> >作为数据成员,您甚至可以使用resize()函数来显式地扩展表,而不是在insert()之后隐式地扩展表。

需要意识到的一件重要的事情是,您还需要提供一种遍历各种元素的方法,以便满足容器的所有需求。通常,这是通过辅助数据来实现所有存储元素的链表来实现的。

但是,您需要解决的一个问题是,如果数组已满,您使用哪个替换策略来替换项。std::unorderd_map使用所谓的链,每个条目都有一个动态大小的(至少有前向迭代,所以至少相当于forward_list)。大多数国际象棋程序都有一个固定大小的哈希表,它有一个替换策略,当一个特定的表项已经被占用时,它总是替换一个项目。

在逻辑上不可能像其他序列容器那样具有resize()成员函数。它是一个映射,它的每个键必须是唯一的。如果您将它的大小调整为某种大小,那么它必须用一些(默认)值填充创建的条目。它应该为键生成什么值?它如何确保密钥的唯一性?这个决定不能由map做出,所以它根本没有resize()成员函数。

如果您的目标是将map的大小调整为已知的大小,以避免进一步可能低效的重新散列,您可以使用std::unordered_map:: reserve。它将设置桶的数量,因此map可以根据负载因子包含给定的元素计数。