Для своей задачи я использую std::list<Key>
для поддержания порядка элементов в импровизированном кэше LRU. Итак, одна из частых операций — извлечение элемента списка и его возвращение в начало списка.
Очевидно, это можно реализовать, используя сначала std::list::erase
, а затем std::list::push_front
. Однако мне не нравится идея иметь дело с перераспределением памяти, когда все, что я хочу сделать, это переместить узел списка в другую позицию.
Это именно то, что метод extract
позволяет нам делать для std::map
, std::set
и т. д.: извлекать узел, изменять его и возвращать обратно без перераспределения вообще.
Есть ли разумное объяснение, почему std::list
не имеет той же функциональности, и есть ли обходной путь для имитации этого с помощью существующего API класса?
list.splice(list.begin(), list, iter)
, гдеiter
указывает на элемент, который вы хотите переместить в начало. - person Daniel Langr   schedule 24.04.2020splice
действительно запрещает сплайсинг из списка в себя, тот, который берет все содержимое исходного списка. Так что вы не правы лишь отчасти. - person Semisonic   schedule 24.04.2020