Мне нужно перебрать некоторые объекты class T
.
Они хранятся в std::set<std::unique_ptr<T>> tees
.
Основная цель тела цикла - использовать объекты, но при этом я также выясню, когда некоторые объекты больше не нужны и могут быть удалены.
Я использую цикл for на основе диапазона для итерации по unique_ptrs:
for (std::unique_ptr<T> & tee : tees)
Я знаю, что не могу вызвать tees.erase (tee) внутри цикла (UB). Поэтому я должен собрать unique_ptr
s, которые нужно удалить в коллекции помощников. Проблема: указатели уникальны, поэтому я не могу скопировать их в коллекцию помощников.
Я мог бы собрать необработанные указатели в std::set<T*>
, но как бы я использовал их после цикла, чтобы удалить соответствующие unique_ptr
s из коллекции tees
? Кроме того, сбор необработанных указателей снова почему-то кажется неправильным, когда я попытался использовать умные указатели в этой проблеме.
Я мог бы переключиться на shared_ptr
, но указатели будут когда-либо использоваться совместно только с целью удаления объектов. Не чувствует себя хорошо.
Я мог бы переключиться с диапазона на диапазон на что-то другое, например, самостоятельно обработать итераторы и получить следующий итератор перед удалением записи. Но возвращение к методикам до C ++ 11 также не кажется правильным.
Я мог бы переключиться на std :: remove_if. ( EDIT : На самом деле я не могу. Объясняется в комментариях под этим вопросом и под принятым ответом.) Тело цикла переместится в лямбду unary_predicate. Но основная цель цикла состоит не в том, чтобы определить, следует ли удалять объекты, а в том, чтобы использовать их, изменяя их.
Кажется, что путь наименьшего сопротивления - вернуться к обработке итераторов, поэтому мне даже не нужна коллекция помощников. Но мне интересно, можете ли вы помочь мне с решением C ++ 11-иш (или 14,17)?