【问题标题】:fixed size unordered_map, how to define?固定大小的unordered_map,如何定义?
【发布时间】:2013-01-19 19:17:24
【问题描述】:

是否可以定义固定大小unordered_map

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

【问题讨论】:

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


    【解决方案1】:

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

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

    但是,您需要解决的一个问题是,如果您的阵列已满,您使用哪种替换策略来替换项目。 std::unorderd_map 使用所谓的链接,每个条目都有一个动态大小的 bucket(至少向前迭代,因此至少相当于 forward_list)。大多数chess programs 都有一个固定大小的哈希表,如果某个特定的表条目已被占用,则该替换策略总是替换一个项目。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这只会提高效率,但如果你不断添加元素,表格仍然会动态调整大小。
        • @rhalbersma,是的,但我想,当他知道元素的确切数量时,TS 可能只是想优化表格填充。
        • 我实际上是在寻找固定大小的地图。所以需要更换政策
        猜你喜欢
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 2012-03-17
        相关资源
        最近更新 更多