C++ std::map能否移动包含的元素?

C++ std::map能否移动包含的元素?,c++,stl,C++,Stl,我希望使用指向存储在std::map中的资源的指针作为资源的句柄,但为了实现这一点,由于从映射中插入/删除,std::map无法移动其包含的任何元素。例如: class Resource { ... } std::map<std::string, Resource> resources; resources["one"] = Resource( ... ); Resource *handle = &resources["one"]; resources["two"] =

我希望使用指向存储在std::map中的资源的指针作为资源的句柄,但为了实现这一点,由于从映射中插入/删除,std::map无法移动其包含的任何元素。例如:

class Resource { ... }
std::map<std::string, Resource> resources;

resources["one"] = Resource( ... );
Resource *handle = &resources["one"];

resources["two"] = Resource( ... );
handle->doSomething(); // Is handle guaranteed to still point to the same resource?
类资源{…}
地图资源;
资源[“一”]=资源(…);
资源*句柄=&resources[“一”];
资源[“两”]=资源(…);
handle->doSomething();//句柄是否保证仍然指向同一资源?

我找不到任何文档,说明元素是否可以移动,STD::MAP可以包含不可复制和不可移动类型,但是我想确保这不是某种对这种类型的预期适应。

< P>从C++标准:A<代码> STD::MAP< /Cord>是一个关联容器:

类模板映射概述[映射.概述]

贴图是支持唯一关键点的关联容器

显示的代码使用
[]
操作符修改映射,该映射是根据
try\u emplace()
指定的:

26.4.4.3地图元素访问[地图访问]

T&operator[](常量键类型&x)

影响:相当于:

返回try\u emplace(x)。第一个->第二个

所有关联容器的一个要求是,插入或放置成员都不会使容器的任何现有迭代器和引用无效,擦除只会使受影响的元素无效:

26.2.6关联容器[关联需求]

插入件和插入件不得影响插入件的有效性 迭代器和容器引用,以及擦除成员 仅使迭代器和对已删除元素的引用无效


换句话说,您的
句柄保持有效,并且不受对同一映射的任何其他更改的影响。只有从映射容器中实际删除时,才会使任何引用或指针无效,并且只会使容器中受擦除影响的元素无效。

我会猜测任何会使指针无效的内容,但这只是猜测。请参阅。AFAIK
std::map
存储节点句柄,而不是直接存储元素。插入新元素不应更改元素本身的实际位置,但可能会使对任何节点句柄的引用无效。不过,还是要带上一点盐