固定大小unordered_map,如何定义?

时间:2013-01-19 19:17:25

标签: c++ unordered-map fixed-size-types

是否可以定义固定大小unordered_map

查看成员函数,没有resize()std::vectorstd::list类似。此外,谷歌没有帮助我。

3 个答案:

答案 0 :(得分:7)

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

要实现的一件重要事情是,您还需要提供一种迭代各种元素的方法,以满足所有容器要求。通常,这是通过在所有存储元素上实现链接列表的辅助数据来完成的。

但是,您需要解决的一个问题是,如果阵列已满,您可以使用哪种替换策略来替换项目。 std::unorderd_map使用所谓的链接,每个条目都有一个动态大小的存储桶(至少前向迭代,至少相当于forward_list)。大多数chess programs具有固定大小的哈希表,其中包含替换策略,以便在特定表条目已被占用时始终替换项目。

答案 1 :(得分:0)

地图在逻辑上不可能具有resize()成员函数,就像其他序列容器一样。它是一张地图,其每个键必须是唯一。如果将其大小调整为某个大小,则必须使用某些(默认)值填充创建的条目。它应该为密钥生成什么值?它如何确保键的唯一性?该决定不能由地图做出,因此它很简单,没有resize()成员函数。

答案 2 :(得分:0)

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