gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:18:31 29 4
gpt4 key购买 nike

我需要遍历 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com