【发布时间】:2013-01-19 19:17:24
【问题描述】:
是否可以定义固定大小unordered_map?
查看成员函数,没有类似std::vector和std::list的resize()。此外,谷歌并没有帮助我。
【问题讨论】:
标签: c++ unordered-map fixed-size-types
是否可以定义固定大小unordered_map?
查看成员函数,没有类似std::vector和std::list的resize()。此外,谷歌并没有帮助我。
【问题讨论】:
标签: c++ unordered-map fixed-size-types
是的,这是可能的,但 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 都有一个固定大小的哈希表,如果某个特定的表条目已被占用,则该替换策略总是替换一个项目。
【讨论】:
从逻辑上讲,地图不可能像其他序列容器那样拥有resize() 成员函数。它是一张地图,它的每一个键都必须是唯一的。如果您将其调整到某个大小,则它必须用一些(默认)值填充 新 创建的条目。它应该为键生成什么值?它将如何确保密钥的唯一性?该决定无法由地图做出,因此它没有resize() 成员函数。
【讨论】:
如果您的目标是将地图大小调整为已知大小以避免进一步可能无效的重新散列,您可以使用std::unordered_map:: reserve。它将设置桶的数量,因此地图可以根据负载因子包含给定的元素数量。
【讨论】: