【问题标题】:Validity of pointers after moving a std::set移动 std::set 后指针的有效性
【发布时间】: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 之前被破坏,所以所有指针都是有效的。

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

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

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

【问题讨论】:

  • 如果你从某个地方搬走了,它的内脏会被撕掉,放在你要搬去的地方。移出的东西将处于未确定状态,但仍可重复使用。
  • 你的推理应该成立。

标签: c++ c++11 std


【解决方案1】:

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

u 应与 rv 在此构造之前具有相同的元素;

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

【讨论】:

  • 天哪,我很高兴u 是在代码标记中,而不是像普通文本一样。
  • @R.MartinhoFernandes I thought the same thing
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 2016-02-19
  • 2018-03-31
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多