c++ - 遍历 std::set<unique_ptr>,如何跟踪哪些要删除?

标签 c++ for-loop iterator unique-ptr stdset

我需要遍历 class T 的一些对象.

它们存储在 std::set<std::unique_ptr<T>> tees 中.

循环体的主要目的是使用对象,但通过这样做,我也会发现何时不再需要某些对象并可以将其删除。

我正在使用基于范围的 for 循环来迭代 unique_ptrs:

for (std::unique_ptr<T> & tee : tees)

我知道我不能在循环 (UB) 内调用 tees.erase(tee)。因此我应该收集 unique_ptr需要在助手集合中删除的 s。问题:指针是唯一的,因此我无法将它们复制到助手集合中。

我可以在 std::set<T*> 中收集原始指针, 但我将如何在循环后使用这些来删除匹配的 unique_ptr来自 tees收藏?此外,当我努力在这个问题中使用智能指针时,再次收集原始指针不知何故感觉不对。

我可以切换到 shared_ptr ,但指针只会出于删除对象的目的而共享。感觉不对。

我可以从基于范围的 for 切换到其他东西,比如自己处理迭代器,并在删除条目之前获取下一个迭代器。但是回到 C++11 之前的技术也感觉不对。

我可以切换到 std::remove_if。 (编辑:实际上我不能。在这个问题下方和接受的答案下方的评论中进行了解释。)循环的主体将移动到 unary_predicate lambda 中。但是循环的主要目的不是确定对象是否应该被删除,而是利用它们,改变它们。

阻力最小的方法似乎是回到迭代器处理,那样我什至不需要辅助集合。但我想知道您是否可以帮助我提供 C++11-ish(或 14,17)解决方案?

最佳答案

我不认为你会找到比

for(auto it = container.begin(), it != container.end();)
{
    //use *it here
    if(needs_to_be_erased)
        it = container.erase(it);
    else
        ++it;
}

由于 std::set 不提供对其元素的可变访问,任何类型的 transformremove 都将不起作用。您必须构建一个迭代器容器,然后在处理完集合后遍历该迭代器容器,为每个迭代器调用 erase

关于c++ - 遍历 std::set<unique_ptr>,如何跟踪哪些要删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52062704/

相关文章:

循环中的 C++ 模迭代器

c++ - 二维循环迭代器

c++ - 如何获取 std::set 的第一个元素

c++ - 如何将静态 const 数组声明和初始化为类成员?

java - 如何在 for 循环 JPA 中保留实体?

java - Java 中的向后嵌套 For 循环?

c++ - P0522R0的中断代码如何?

c++ - 温索克 : Windows networking programming in C++

python - 循环内的副作用会影响它的生成器吗?

java - 迭代所有 json 对象并替换值