Удалить элемент в 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) тоже хорошо.

Другие вопросы по тегам