【发布时间】:2019-07-15 21:24:05
【问题描述】:
我正在尝试开发自己的容器来实现哈希表。主要要求是这个容器必须与 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 {
然后我使用这样的内部成员类型为我的容器分配节点。
template<class T>
struct ch_node_t : hash_node {
template<class... Args>
ch_node_t(Args&&... args) : value(std::forward<Args>(args)...) {
}
T value;
};
using node_type = ch_node_t<T>;
using storage_allocator_ = typename Alloc::template rebind<node_type>::other;
这样分配节点是否正确?这是来自insert 方法的一段代码。
auto node = &storage_[slot];
if(!node_traits::is_allocated(*node)) {
new(node) node_type(v.second);
node_traits::link_head(*node);
--freelist_;
}
storage 是指向已分配池的指针。这就是我分配池的方式:
storage_ = storage_allocator_.allocate(size_);
我不明白的主要事情是如何正确使用std::allocator<std::pair<const Key, T>> 管理节点密钥?我需要分别创建索引和存储之类的东西吗?
探索std::unordered_map 代码太难得到这些答案,这就是为什么我在开发自定义容器时向您询问方向。
【问题讨论】:
标签: c++ memory-management allocator