【问题标题】:Move `unique_ptr`s between sets在集合之间移动 `unique_ptr`s
【发布时间】:2015-07-14 22:21:53
【问题描述】:

我有两个集合和一个指向 a 元素的迭代器:

set<unique_ptr<X>> a, b;
set<unique_ptr<X>>::iterator iter = find something in a;

我想将iter指向的元素从a中移除,并插入到b中。可能吗?怎么样?

【问题讨论】:

  • @black:我相信这个问题是独立的。如果您足够聪明地回答问题,那么问题对您来说应该是不言而喻的。
  • 不过,在我看来,问题应该在问题中很明显,并且不应该要求您编写代码来显示。我看到的问题可能与您看到的不同。我遇到了constness 的问题,你呢?
  • @black:你不需要编写任何代码。事实上,我什至没有尝试编译任何代码,因为我对这种语言非常了解,知道插入和擦除是行不通的。这个问题是针对那些足够了解 C++ 标准的人提出的,并且可能会将我指向 std::set 接口的特定部分,或者它们的组合,这将完成我所需要的。问题就在那里,如果您认为 SO 上的每个问题都转化为编译器错误,那对您来说太糟糕了。

标签: c++ containers unique-ptr


【解决方案1】:

好吧,我怀疑没有正常的方法可以做到这一点。但总有一个不正常的:) 您可以执行以下操作:

auto tmp = const_cast<std::unique_ptr<std::string>&&>(*iter);
a.erase(iter);
b.insert(std::move(tmp));

好的,第一行违反了set 不变量,这很可怕,但据我了解,这应该不是问题,因为在下一行我们从集合中删除了这个邪恶的节点。

【讨论】:

  • 这不会在擦除时使 unique_ptr 失效吗?
  • @TasosVogiatzoglou,不,不会。我们将对象从集合a 移动到tmp,并在擦除集合a 包含moved-from unique_ptr 对象。
  • 哦,好的。当我阅读它时,我认为删除后会调用删除器。
  • 好吧,这严重违反了set 不变量,以至于我无法确定每个 rb-tree 实现都会在 擦除违反节点...猜猜那是不可能的...
  • 实际上我可以想象 rb-tree 实现会在此代码上失败。考虑一个不存储父指针并从根进行搜索以进行擦除的方法。不确定标准是否允许,否则它是合法的 rb-tree。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多