固定大小的unordered_map,如何定义
fixed size unordered_map, how to define?
是否可以定义固定大小的unordered_map
?
看成员函数,没有类似于std::vector
和std::list
的resize()
。而且,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可以根据负载因子包含给定的元素计数。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- Eclipse CDT将方法定义定义到标头文件
- 什么是C++中的不确定行为?它与未定义的行为有何不同
- LEX 程序中的未定义定义