我希望使用侵入式unordered_map。由于某种原因,库中只有一个unordered_set。还有一个侵入式哈希表,但我不确定它是否具有相同的功能,也没有相同的界面。
我错了,我错过了unordered_map链接?
如果我不是,那么有一个教程可以帮助我实现一个吗?
答案 0 :(得分:7)
这是一个有趣的问题。 Boost.Intrusive似乎没有提供任何有序或无序的地图接口。它有很多实现类型可以正常工作,因为它们都是有序的(红黑树,AVL树,splay树)和无序(hashtables)。但没有地图,我无法告诉你原因。
我看到你有两个选择:
hashtable
:无序容器实现为哈希表(并且它们不是称为 hash_map
的唯一原因是避免与预先存在的库发生名称冲突已经使用该名称)。如果你想完成你的工作,这将有效。std::set
和std::map
通常都是作为红黑树周围的包装器实现的(在我看过的所有标准库实现中:GCC,MSVC和Apache的stdcxx)。另请参考libstdc ++如何在<map>
和<set>
中包装其树实现。这是很多样板文件,其中大部分内容繁琐,但两种类型都将几乎所有的工作推迟到树上。 Boost.Intrusive的unordered_set
几乎肯定会发生类似的事情。您需要查看map和set接口之间的差异,并将其用作将unordered_set
修改为unordered_map
的基础。我做了后者。这有点单调乏味,我强烈建议为它编写单元测试(或者窃取libstdc ++或Boost.Intrusive附带的单元测试)。但这是可行的。我还强烈建议您在SGI(set,map)或libstdc++
上阅读集合和地图的需求文档 更新:我意识到他们为什么不做地图:侵入式容器要求您将数据结构的节点信息嵌入到您存储在其中的值类型中。对于地图,您必须为值和键执行此操作。这不是不可能的,但map
的标准实现使用相同的内部类型作为set
。但是那些内部类型只有一个 value_type
变量:要存储键和值,它们将键和值复制到该变量中并将其存储在节点中。要使用侵入式类型(即不进行复制),您必须将该实现类型修改为与集不兼容:它必须存储对键和值的单独的引用。所以要做到这一点,你还必须修改你使用的实现(可能是hashtable
)。同样不是不可能,但图书馆设计师可能会试图避免严重的代码重复,因此在没有简单的方法实现这一点的情况下,他们很可能决定将地图留下来。
这有意义吗?
答案 1 :(得分:6)
自问这个问题已经有很长一段时间了,但我认为来这里的人应该对如何使用unordered_set
作为地图感兴趣。解决方案是使用advanced insertions methods:只需将密钥及其值存储在同一value_type
中,然后使用insert_check
和insert_commit
插入。