std::list
позволяет вам разделять часть одного списка на другой (удаляя его из первого списка), не делая недействительными какие-либо итераторы, ссылки или указатели, и список источника и список назначения могут быть одним и тем же объектом.
(Это соответствует черновому стандарту C ++ 11; я не знаю, говорит ли то же самое о стандарте C ++ 03).