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