multimaps如何在内部处理重复键?

时间:2015-01-23 19:53:41

标签: c++ dictionary data-structures multimap

使用地图,我可以理解它被实现为二叉搜索树(例如红/黑树)及其时间复杂度。

但是使用multimaps,内部如何处理关键冲突?是否为具有相同键的所有节点维护了一个列表?或者进行一些其他处理。我遇到过一种情况,我可以使用map<int,vector<strings>>multimap<int,string>,并想知道权衡。

1 个答案:

答案 0 :(得分:4)

C ++规范没有给出std::multimap的具体实现,而是要求std::multimap上的操作应该有多快,以及应该保留哪些操作。例如,insert上的multimap需要将键/值对插入multimap,并且必须以使得它具有相同键的所有现有条目之后的方式执行此操作。这必须在时间O(log n)中工作,并且如果插入以提示发生并且提示是元素应该到达之前的点,则具体地分摊O(1)。仅使用此信息,multimap可以通过具有许多节点的红/黑树,每个键一个,或者可以是存储每个键的vector值的红/黑树来工作。 (这排除了一个AVL树,因为AVL树插入中涉及的旋转不会在摊销的O(1)时间内运行。但是,它也允许像2-3-4树或确定性跳过列表这样的事情。

但是,随着我们添加更多要求,某些实现被排除在外。例如,如果给予要擦除的元素的迭代器,则erase操作需要以分摊的常量时间运行。这排除了使用具有键和vector值的单个节点,但它不排除具有键和双向链接值列表的单个节点。 iterator类型需要能够取消引用value_type,这需要匹配基础allocator value_type。这排除了在红/黑树中具有单个键和值的链接列表的单个节点的可能性,因为您无法以这种方式获得对value_type的引用。

总的来说,这些限制使得一个允许的实现是一个红/黑树,每个键/值对有一个节点,但其他也可能。其他想法 - 比如使用AVL树,或将给定键的值合并到vectorlist - 都是不可能的。

希望这有帮助!