C++ std::map能否移动包含的元素?
我希望使用指向存储在std::map中的资源的指针作为资源的句柄,但为了实现这一点,由于从映射中插入/删除,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"] =
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关联容器[关联需求]
插入件和插入件不得影响插入件的有效性
迭代器和容器引用,以及擦除成员
仅使迭代器和对已删除元素的引用无效
换句话说,您的句柄保持有效,并且不受对同一映射的任何其他更改的影响。只有从映射容器中实际删除时,才会使任何引用或指针无效,并且只会使容器中受擦除影响的元素无效。我会猜测任何会使指针无效的内容,但这只是猜测。请参阅。AFAIKstd::map
存储节点句柄,而不是直接存储元素。插入新元素不应更改元素本身的实际位置,但可能会使对任何节点句柄的引用无效。不过,还是要带上一点盐