如果我们在地图的红黑树发生变化时移动了map <int, vector<int> >
vector
,或者它存储指向vector
s或类似内容的指针并且不移动它们(使用map的其他工作将不再是O(lg n),例如,如果我们将push_back元素转换为某些vector
s)
答案 0 :(得分:9)
看到这个: std::map, pointer to map key value, is this possible?
第二个最高答案:
第23.1.2节#8(关联容器要求):
“插入成员不应影响迭代器的有效性和对容器的引用,并且擦除成员应仅使迭代器和对已擦除元素的引用无效。”
所以 yes 保证指向map元素的数据成员的指针保证有效,除非你删除那个元素。
因此,如果保留了引用,则无法将数据复制到内存的不同部分。如果是这种情况,我根本没有看到执行任何副本的重点......
答案 1 :(得分:1)
不,矢量不会被移动。树的操作只是重新排列节点之间的指针。它们不会将节点或其内容移动到内存中。
答案 2 :(得分:1)
我相信C ++ 03不能保证内存中数据的稳定性,这将是一个实现细节(实际上并不是你无需测试就可以安全地假设)
请注意,将迭代器保存到地图中以及实际向量在内存中的位置是完全不同的东西。迭代器的有效性在C ++规范中明确定义(无论何时有效,何时不有),但树的实际内部行为不是。
也就是说,任何体面的编译器(对于发布版本/启用了优化)都会优化实现,以便在向量在树中移动时不实际复制向量,而std::map
的C ++ 11实现将使用移动语义来保证行为。
你不能假设的是内部只有指针被移动。