我的结构在概念上具有以下
class C {/* expensive class */};
struct mapping {
std::map<std::pair<C,C>, C> the_map;
};
这不太理想,因为大量的C副本最终被存储。我目前的解决方案是创建一组C,然后在地图中存储指针(或迭代器)。
struct mapping {
std::set<C> all_Cs;
std::map<std::pair<C*, C*>, C*> the_map;
};
这应该是安全的,因为在all_Cs之前总是会破坏the_map所以所有指针都是有效的。
复制构造可以通过复制集合并重建地图来完成,但是可以有效地实现移动构造吗?
据我所知,移动一个具有相同分配器的集合需要是一个常量操作(我假设)强制实现维持指向集合中对象的指针的有效性但我找不到任何支持它的东西在标准中。使用这个我应该能够通过简单地移动集合和地图来实现移动构造函数,并且所有指针都将被新对象正确拥有。
这种推理是否正确,我可以以便携方式依赖此行为吗?
答案 0 :(得分:3)
通过表99(可识别分配器的容器要求),保证移动构造保留容器中的对象。除了常量复杂性要求(排除重新分配元素)之外,X u(rv)
状态的后置条件:
在构造之前,
u
应具有与rv
相同的元素;
移动作业不提供相同的保证。如果分配器的特征告诉它不传播分配器,它将分配新元素,并且没有明确说明它不会传播。