【问题标题】:how to check if unique_ptr points to the same object as iterator如何检查 unique_ptr 是否指向与迭代器相同的对象
【发布时间】:2021-12-30 11:30:33
【问题描述】:

让我们考虑这样的方法:

void World::remove_organism(organism_iterator organism_to_delete)
{
    remove_if(begin(organisms_vector), end(organisms_vector), [](const unique_ptr<Organism>& potential_organism_to_del)
        {

        });
}

我想要实现的是从vector&lt;unique_ptr&lt;Organism&gt;&gt; 中删除iterator 指向的有机体,那么我应该如何比较unique_ptr&lt;Organism&gt;std::vector&lt;unique_ptr&lt;Organism&gt;&gt;::iterator

【问题讨论】:

  • unique_ptr 值是唯一的,因此“指向同一个对象”的唯一方法是如果您有两个对同一个 unique_ptr 的引用。也就是说,无论如何比较持有的指针可能更容易......只需调用get()
  • @BenVoigt 你能告诉我具体的代码行吗?
  • return potential_organism_to_del.get() == organism_to_delete-&gt;get();.. 而且,如果您要删除迭代器指向的元素,为什么不直接调用 vector::erase(iterator),因为您知道它已经存在于该容器中。

标签: c++ vector iterator unique-ptr


【解决方案1】:

您不必搜索vector 来查找迭代器;你只需要删除它:

void World::remove_organism(organism_iterator organism_to_delete)
{
    organism_vector.erase(organism_to_delete);
}

或者如果你只想删除unique_ptr指向的元素:

void World::remove_organism(organism_iterator organism_to_delete)
{
    organism_to_delete->reset();
}

【讨论】:

  • 没错。 std::vector 具有随机访问迭代器。无需遍历向量即可找到所需的元素。
  • @digito_evo:这与迭代器是随机访问、双向还是仅前向没有任何关系。每种迭代器都可以廉价访问指定位置的对象,否则它就不是迭代器。
  • organism_to_delete-&gt;reset(); 将销毁指向的Organism,并将unique_ptr 设置为保持nullptr,但不会从vector 中删除unique_ptr
猜你喜欢
  • 2021-12-02
  • 2020-04-14
  • 2016-03-01
  • 2011-03-02
  • 2010-10-23
  • 1970-01-01
  • 2019-12-09
  • 2015-03-01
相关资源
最近更新 更多