Удалить элемент в std::list, оставив его выделенным
Я строю std::list
элементов (структур компонентов графа), которые периодически объединяются. Идея состоит в том, что если я обнаружу узел, соединяющий два компонента, они станут одним компонентом, и мой список перечислит мои компоненты. Каждый компонент имеет дескриптор (в этом случае std::list<component>::iterator
) к "родительскому" компоненту, который устанавливается после слияния. Таким образом, чтобы определить компонент, к которому принадлежит конкретный узел, я иду по этой цепочке.
В конце концов, я ищу операцию на std::list
что позволяет мне взять итератор элемента N
и удалите его из списка, но не освобождая его: структура остальной части списка изменяется точно так же, как и обычное удаление.
Желательно что-то менее уродливое, чем перераспределение элемента, копирование его из списка и вызов реального remove
или же erase
,
Возможно, я смогу сделать это с splice
, Мне нужно склеить элементы, которые будут удалены в "мусор" list
не так ли?
1 ответ
Вы можете сделать это с помощью сплайсинга. Например, переместить *it
в мусорный список:
junk.splice(junk.begin(),comp_list,it);
Вы также можете добавить Move-Ctor в component
, Затем, перед удалением из списка, переместите содержимое в tmp var, примерно так:
component tmp(*it);
li.erase(it);
Также предложение Фомина Арсения использовать список указателей на компоненты (или std::shared_ptr
) тоже хорошо.