我想要使用一个侵入式的unordered_map。但是库中只有一个unordered_set。还有一个侵入式的哈希表,但我不确定它是否具有相同的功能,而且它的接口也不同。
如果我错了并且错过了unordered_map的链接,那请告诉我。
如果我没有错,是否有教程可以帮助我实现一个unordered_map?
我想要使用一个侵入式的unordered_map。但是库中只有一个unordered_set。还有一个侵入式的哈希表,但我不确定它是否具有相同的功能,而且它的接口也不同。
如果我错了并且错过了unordered_map的链接,那请告诉我。
如果我没有错,是否有教程可以帮助我实现一个unordered_map?
hashtable
:无序容器被实现为哈希表(它们之所以不被称为hash_map
,是为了避免与已经使用该名称的预先存在的库发生名称冲突)。如果你想完成工作,这将起作用。
2. 如果你真的想要自己实现,你需要查看Boost.Intrusive的unordered_set接口描述。我没有查看过实现,但它几乎肯定是一个或多个树类型的包装器。标准库中的std::set
和std::map
通常都是包装在红黑树周围的(在我查看过的所有标准库实现中:GCC的、MSVC的和Apache的stdcxx)。还要看一下libstdc++如何在<map>
和<set>
中包装它们的树实现。这是很多样板文件,其中许多都很繁琐,但这两种类型几乎将所有工作都推迟到了树上。Boost.Intrusive的unordered_set
几乎肯定也发生了类似的事情。你需要查看映射和集合接口之间的区别,并以此为基础修改unordered_set
成为unordered_map
。map
使用与 set
相同的内部类型。 但是,这些内部类型只有一个 value_type
变量:为了存储键和值,它们将键和值复制到该变量中,并将其存储在节点中。 要使用侵入式类型(即无需复制)执行此操作,您必须修改该实现类型以与集合不兼容:它必须单独存储键和值的引用。 因此,要执行此操作,您还必须修改所使用的实现(可能是 hashtable
)。 再次强调,这并非不可能,但是在没有简单方法实现此操作的情况下,库设计人员很可能决定放弃使用映射。
这样说清楚了吗?
虽然这个问题已经被问了很长时间,但我认为来到这里的人应该对如何将unordered_set
用作映射表感兴趣。解决方案是使用高级插入方法:只需在同一个value_type
中存储键和其值,并使用insert_check
和insert_commit
进行插入。