std :: map可以移动包含的元素吗?

时间:2020-02-07 01:34:05

标签: c++ stl

我想使用指向存储在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?

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

1 个答案:

答案 0 :(得分:2)

根据C ++标准:std::map是一个关联容器:

类模板地图概述[map.overview]

地图是一个支持唯一键的关联容器...

所示的代码使用[]运算符来修改映射,该映射是根据try_emplace()来指定的:

26.4.4.3地图元素访问[map.access]

T& operator[](const key_type& x);

效果:等同于:

return try_emplace(x).first->second;

所有 关联容器的要求之一是,insert和emplace成员均不会使任何现有的迭代器和对该容器的引用无效,而擦除操作只会使受影响的容器无效元素:

26.2.6关联容器[associative.reqmts]

insert和emplace成员不得影响 容器的迭代器和引用,以及擦除成员 仅使迭代器和对已删除元素的引用无效。

换句话说,您的handle仍然有效,并且不受同一地图其他更改的影响。只有从地图容器中实际删除后,所有引用或指针才会无效,并且仅使容器中受擦除影响的元素无效。