代码之家  ›  专栏  ›  技术社区  ›  mo FEAR

C++ STL映射是否在创建后移动了一个值的位置?

  •  1
  • mo FEAR  · 技术社区  · 3 年前

    我已经阅读了一些提示,在将一个对象插入到C++ STL映射中之后,只要不删除它,它在内存中的位置就不会改变。但没有人提到任何文献或来源来支持它,所以我不知道这些提示有多可靠。有人能明确/可靠地回答这个问题吗?它会依赖于实现吗?有保证书吗?

    1 回复  |  直到 3 年前
        1
  •  2
  •   eerorika    3 年前

    C++ STL映射是否在创建后移动了一个值的位置?

    有人能明确/可靠地回答这个问题吗?

    你可以信赖它。

    它会依赖于实现吗?

    它不能依赖于实现。

    有保证书吗?

    是的,它是在C++标准中保证的:

    [集装箱修订要求]

    除非另有规定(明确地或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给库函数不得使迭代器失效或更改容器中对象的值。

    [关联需求概述]

    insert、insert_range和emplace成员不得影响迭代器和对容器的引用的有效性,而erase成员只能使迭代器和对已删除元素的引用无效。

    提取成员仅使移除元素的迭代器无效;指向已删除元素的指针和引用仍然有效。 但是,当元素属于节点类型时,通过此类指针和引用访问该元素是未定义的行为。 如果元素被成功插入,则在节点_类型拥有时获得的元素的引用和指针将无效。