C++ 如何在自定义容器中正确使用std::分配器?

C++ 如何在自定义容器中正确使用std::分配器?,c++,memory-management,allocator,C++,Memory Management,Allocator,我正在尝试开发自己的容器,它将实现哈希表。主要要求是该容器必须与STL兼容。现在我不知道如何分配内存和初始化对象以满足内部容器的需要 主要问题是如何管理此类容器的密钥?我是否需要为哈希函数从键生成的索引分配另一个存储?然后用节点存储桶将它们链接到实际存储 有我的容器的模板参数 template< class Key, class T, class Hasher = std::hash<Key>, class KeyEqual = std::equal_to<

我正在尝试开发自己的容器,它将实现哈希表。主要要求是该容器必须与STL兼容。现在我不知道如何分配内存和初始化对象以满足内部容器的需要

主要问题是如何管理此类容器的密钥?我是否需要为哈希函数从键生成的索引分配另一个存储?然后用节点存储桶将它们链接到实际存储

有我的容器的模板参数

template<
    class Key, class T, class Hasher = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Alloc = std::allocator<std::pair<const Key, T>>>
class my_hashtable_v1 {
其中
storage
是指向已分配池的指针。这就是我分配池的方式:

storage_ = storage_allocator_.allocate(size_);
我不明白的主要问题是如何正确地使用
std::allocator
管理节点密钥?我需要分别创建索引和存储之类的东西


探索
std::unordered_map
代码很难得到这些答案,这就是为什么我在开发自定义容器时向您询问方向。

为了分配另一种类型的对象(我们称之为
Node
),而不是
std::allocator\u traits::value_type
(我们称之为
T
),如果
Alloc
可能是自定义分配器类型,则必须
rebind
分配器才能获得类型
节点的分配器:

template<
    class Key, class T, class Hasher = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Alloc = std::allocator<std::pair<const Key, T>>>
class my_hashtable_v1 {
using node_alloc_t = std::allocator_traits<Alloc>::rebind_alloc<Node>;
node_alloc_t node_alloc;
node_alloc.allocate(size_);
使用node\u alloc\u t=std::allocator\u traits::rebind\u alloc;
node_alloc_t node_alloc;
节点分配(大小);
但是如何正确处理钥匙呢?我是否需要为索引创建另一个存储

您不一定需要为密钥创建单独的存储。可以将它们存储在节点中。例如,这就是基于树的容器的工作方式

我的节点类型不包含任何键


如果要单独存储密钥,则需要为它们分配存储。

我使用别名
使用存储\u分配器\u=typename Alloc::template rebind::other但如何正确处理密钥?我是否需要为索引创建另一个存储?因为我必须对密钥应用哈希函数。并且我的节点类型不包含任何键。@powercat注意,
rebind
成员已被弃用,并在c++20中被删除。您应该像在我的示例中一样使用
std::allocator\u traits::rebind\u alloc
。@powercat请参阅edt。感谢您提供有关C++20的说明!好的,那么我将尝试在节点内存储键。
using node_alloc_t = std::allocator_traits<Alloc>::rebind_alloc<Node>;
node_alloc_t node_alloc;
node_alloc.allocate(size_);