集合,多集,地图和多图如何在内部工作

时间:2009-08-06 07:06:25

标签: c++ data-structures stl dictionary set

多集合如何工作?如果一个集合没有映射到一个键的值,它是否只保存键?

另外,关联容器如何工作?我的意思是内存中的向量和双端队列顺序定位意味着删除/删除(除了开始[deque]和end [vector,deque])如果它们很大就会很慢。

并且list是一组指针,它们不是按顺序位于内存中,这会导致搜索时间更长,但删除/删除速度更快。

如何存储集合,地图,多重集和多重映射以及它们如何工作?

3 个答案:

答案 0 :(得分:12)

这4个容器通常都是使用“节点”实现的。节点是存储一个元素的对象。在[multi] set case中,元素只是值;在[多]映射的情况下,每个节点存储一个密钥及其相关值。节点还存储指向其他节点的多个指针。与列表不同,集合和映射中的节点形成树。您通常会对其进行排列,使得某个节点“左侧”的分支的值小于该节点的值,而某个节点“右侧”的分支的值高于该节点。

现在查找地图键/设定值的操作非常快。从树的根节点开始。如果匹配,那就完成了。如果根较大,请在左侧分支中搜索。如果root小于您要查找的值,请按指向右侧分支的指针。重复,直到找到值或空分支。

插入元素是通过创建一个新节点,在树中找到它应该放置的位置,然后通过调整它周围的指针插入节点来完成的。最后,有一个“重新平衡”操作,以防止您的树失去平衡。理想情况下,每个左右分支的大小大致相同。重新平衡的工作原理是将一些节点从左向右移动,反之亦然。例如。如果你有值{1 2 3}并且你的根节点是1,那么左边的分支上有2和3,右边的分支是空的:

1
 \
  2
   \
    3

通过选择2作为新的根节点来重新平衡:

  2
 / \
1   3

STL容器使用更智能,更快速的重新平衡技术,但这种详细程度无关紧要。它甚至没有在标准中指定应该使用更好的技术,因此实现可能会有所不同。

答案 1 :(得分:0)

可以有任何实现,只要它们符合这些容器的标准规范。

AFAIK,关联容器实现为二叉树(红黑)。更多细节......取决于实施。

答案 2 :(得分:-1)

所有关联容器类(地图,多地图,集合,多集合)均通过红色和黑色(R-B树)树实现。因此,R-B树的实现可能与此类似:-

struct Rb_node {
    int value;
    struct node *left, *right;
    int color;
    int size;
};