3

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

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 之前被破坏,因此所有指针都是有效的。

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

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

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

4

1 回答 1

3

表 99(可识别分配器的容器要求)保证移动构造保留容器中的对象。除了恒定的复杂性要求(排除重新分配元素)之外,X u(rv)状态的后置条件:

urv应具有与此构造之前相同的元素;

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

于 2013-04-05T11:20:43.157 回答