C++ 移动std::集合后指针的有效性

C++ 移动std::集合后指针的有效性,c++,c++11,std,C++,C++11,Std,我有一个结构,在概念上有以下内容 class C {/* expensive class */}; struct mapping { std::map<std::pair<C,C>, C> the_map; }; C类{/*昂贵类*/}; 结构映射{ std::映射_映射; }; 这并不理想,因为最终会存储大量的C副本。我目前的解决方案是创建一组C,然后在映射中存储指针(或迭代器) struct mapping { std::set<C>

我有一个结构,在概念上有以下内容

class C {/* expensive class */};
struct mapping {
    std::map<std::pair<C,C>, C> the_map;
};
C类{/*昂贵类*/};
结构映射{
std::映射_映射;
};
这并不理想,因为最终会存储大量的C副本。我目前的解决方案是创建一组C,然后在映射中存储指针(或迭代器)

struct mapping {
    std::set<C> all_Cs;
    std::map<std::pair<C*, C*>, C*> the_map;
};
结构映射{ std::设置所有_Cs; std::映射_映射; }; 这应该是安全的,因为_映射总是在所有_c之前被销毁,所以所有指针都是有效的

复制构造可以通过复制集合和重建地图来完成,但是否可以有效地实现移动构造

据我所知,使用相同的分配器移动集合需要一个常量操作(我假设)强制实现保持集合中对象指针的有效性,但我在标准中找不到任何支持这一点的方法。使用这个,我应该能够通过简单地移动集合和映射来实现移动构造函数,并且所有指针都将正确地归新对象所有


这个推理正确吗?我能以可移植的方式依赖这个行为吗?

根据表99(分配器感知的容器要求),移动构造保证保存容器中的对象。除了恒定的复杂性要求(排除重新分配元素)之外,
xu(rv)
的post条件还规定:

u
应具有与施工前的
rv
相同的元件


移动分配不提供相同的保证。如果分配器的特性告诉它不要传播分配器,并且没有明确声明它不会传播分配器,那么它将分配新元素。

如果你从某个地方移动,它的内脏将被撕掉,放在你要移动到的任何地方的目的地。从中移出的东西将处于未确定状态,但仍可重复使用。你的推理应该是正确的。天哪,我很高兴
u
在代码标记中,不像普通文本。@R.MartinhoFernandes I