std :: map和已插入数据的行为

时间:2010-03-19 12:24:10

标签: c++ stl

插入新数据时,std::map是否已移动已插入的

4 个答案:

答案 0 :(得分:9)

地图以树形式实现,当您插入新元素时,树可能需要重新平衡。

not 使任何迭代器或对树中元素的引用无效。这种平衡是通过操纵指针完成的,所以你没有什么可担心的;节点本身保持不变。

平衡涉及通过告知节点他们的孩子,父母和兄弟姐妹是通过重新分配指针来改变树的结构,但这是一个实现细节。从逻辑上讲,没有任何改变。

答案 1 :(得分:2)

该标准不强制要求STL的特定实现,只强制行为和运行时特性。也就是说,跳过列表或树是std :: map的一个非常可能的实现,因此链接将被更新,相对顺序将改变,但实际数据不会移动。

答案 2 :(得分:0)

考虑双向链表中的典型节点:

template <class T>
struct Node
{
  Node* mPrevious;
  Node* mNext;
  T mValue;
};

在两个现有节点之间插入新节点时,您只需要重新布线。

void insert(Node* target, Node* newNode)
{
  target->mPrevious->mNext = newNode;
  target->mPrevious = newNode;

  newNode->mPrevious = target->mPrevious;
  newNode->mNext = target;
}

此行为与std::map(或std::setstd::multimapstd::multiset类似,因为它们通常都使用相同的基础结构实现。

这意味着指向现有元素的任何迭代器也都有效。我确实坚持现有元素位。 end返回的迭代器应在插入或删除后重新计算,最好不要缓存。

答案 3 :(得分:0)

C ++标准并未规定std::map仅实现其行为和效率。允许实现移动项目;但是,这可能效率低下。

大多数std::map个容器是使用带链接的树数据结构实现的。插入或重新排序项目时,链接会更改,但不会移动数据。移动项目会减慢std::map的执行时间。