【发布时间】:2013-03-27 18:41:34
【问题描述】:
我的结构在概念上具有以下内容
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 之前被破坏,所以所有指针都是有效的。
复制构建可以通过复制集合和重建地图来完成,但是是否可以有效地实现移动构建?
据我了解,移动具有相同分配器的集合需要是一个常量操作,这(我假设)强制实现保持指向集合中对象的指针的有效性,但我找不到任何支持它的东西在标准中。使用它,我应该能够通过简单地移动集合和地图来实现移动构造函数,并且所有指针都将正确地归新对象所有。
这种推理是否正确,我可以以可移植的方式依赖这种行为吗?
【问题讨论】:
-
如果你从某个地方搬走了,它的内脏会被撕掉,放在你要搬去的地方。移出的东西将处于未确定状态,但仍可重复使用。
-
你的推理应该成立。