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

Kon*_*tin 6 c++ stl

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

GMa*_*ckG 9

地图实现为树,当您插入新元素时,可能需要重新平衡树.

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

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

  • @Charles 23.1.2/8还声明对容器的引用无效. (9认同)
  • 我想知道,如果`it`是一个元素的迭代器,那么在插入之前和之后`*it`指的是相同的map条目但是它保证`&*it`保持不变?在大多数实现中,我希望这是真的,但是可以实现具有足够代理的迭代器,元素可以移动但迭代器保持一致性. (2认同)
  • @Charles:也许答案的措辞不够明确:节点不会被移动.平衡树(逻辑结构)的形状将发生变化,但元素永远不会在内存的不同部分重新定位.每个节点都在内存中的某个位置创建,并且永远不会改变.重新平衡树时,左,右和父指针的值将更改为指向不同的节点,但节点本身仍将位于相同的内存地址中,尽管与树的根不同. (2认同)