我有一个结构,它在概念上具有以下内容
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;
};
这应该是安全的,因为 the_map 总是在 all_Cs 之前被破坏,因此所有指针都是有效的。
复制构造可以通过复制集合和重建地图来完成,但是是否可以有效地实现移动构造?
据我了解,移动具有相同分配器的集合需要是一个常量操作,这(我假设)强制实现保持指向集合中对象的指针的有效性,但我在标准中找不到任何支持这一点. 使用它,我应该能够通过简单地移动集合和地图来实现移动构造函数,并且所有指针都将正确地归新对象所有。
这是正确的推理吗?我可以以可移植的方式依赖这种行为吗?