我期待使用的侵入unordered_map。 出于某种原因,只有在图书馆的unordered_set。 还有一个侵入哈希表,但我不知道它具有相同的functunality,也不会具有相同的接口。
我错了,我错过了unordered_map链接?
如果我不是有一个教程,这将有助于我实现一个?
Answer 1:
这是一个有趣的问题。 Boost.Intrusive似乎并没有提供任何的地图界面,有序或无序。 它有很多实现类型,这将很好地工作既是订购(红黑树,AVL树,伸展树)和无序(哈希表)映射。 但是,没有地图,我不能告诉你为什么。
你有两个选择,我看到它:
- 只需使用
hashtable
:无序容器作为哈希表实现的(他们不叫的唯一原因hash_map
是为了避免名称冲突,使用该名称已预先存在的库)。 如果你想你所做的工作,将工作。 - 如果你真的想实现你自己的,你想看看对于Boost.Intrusive的接口描述unordered_set 。 我没有看过的实现,但它几乎肯定是一种或多种类型的树周围的包装。
std::set
和std::map
都通常被实现为围绕一个红黑树(在所有标准库的实现我已经看了:GCC的,MSVC的,和Apache的stdcxx)包装。 还采取如何的libstdc ++包在自己的树上执行<map>
和<set>
。 这是一个很大的样板,其中大部分是单调乏味的,但是这两种类型的延迟几乎所有的工作树。 类似的事情几乎可以肯定与Boost.Intrusive的发生unordered_set
。 您需要看地图和组接口之间的差异,并用它作为修改的基础unordered_set
到unordered_map
。
我已经做了后者。 这是在单调乏味的一面位,我强烈强烈建议编写单元测试它(或窃取附带的libstdc ++或Boost.Intrusive的那些)。 但它是可行的。 我也强烈建议阅读套和地图的需求文档,无论是在SGI( 设定 , 地图 )或的libstdc ++
更新:我明白了为什么他们没有做地图:侵入容器要求你为嵌入在你存储在它的值类型的数据结构的节点信息。 对于地图,你将不得不为价值观和按键都做到这一点。 这并不是说这是不可能的,但对于一个标准的实现map
使用相同的内部类型的set
就做。 但是,这些内部类型只有一个 value_type
变量:存储键和值它们复制键和值成变量,并存储在节点。 要做到这一点与侵入型(即不复制),你就必须修改实现类型是带套不兼容的:它必须单独储存,以键和值引用。 因此,要做到这一点,你也必须修改您使用实现(可能hashtable
)。 同样不是不可能的,但是库设计者很可能试图避免严重的重复代码,以便在没有简单的方法来实现这一点,他们最有可能决定离开地图了。
那有意义吗?
Answer 2:
这是一个很长的时间,因为这个问题已经被问过,但我认为,人们来这里应该关注如何使用unordered_set
作为地图。 该解决方案是使用先进的插入方法 :一个只具有存储密钥,它在相同的值value_type
,并使用插入insert_check
和insert_commit
。
文章来源: Boost.Intrusive and unordered_map