Удалить элемент в std :: list, оставив его выделенным

Я строю std::list элементов (структур компонентов графа), которые периодически объединяются. Идея заключается в том, что если я обнаружу узел, соединяющий два компонента, они станут одним компонентом, и мой список перечислит мои компоненты. Каждый компонент имеет дескриптор (в этом случае std::list<component>::iterator) к «родительскому» компоненту, который устанавливается после слияния. Этот способ определения компонента, к которому принадлежит конкретный узел, проходит по этой цепочке.

В конце концов, я ищу операцию на std::list что позволяет мне взять итератор элемента N, а также Удалить это из списка, но без его освобождения: структура остальной части списка изменяется точно так же, как и обычное удаление.

Желательно что-то менее уродливое, чем перераспределение элемента, копирование его из списка и вызов реального remove или же erase,

Возможно, я смогу сделать это с splice, Мне нужно склеить элементы, которые будут удалены в «мусор» listне так ли?

6

Решение

Вы можете сделать это с помощью сплайсинга. Например, переместить *it в мусорный список:

junk.splice(junk.begin(),comp_list,it);

Вы также можете добавить Move-Ctor в component, Затем, перед удалением из списка, переместите содержимое в tmp var, примерно так:

component  tmp(*it);
li.erase(it);

Также предложение Фомина Арсения использовать список указателей на компоненты (или std::shared_ptr) тоже хорошо.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]