Последовательные контейнеры STL поддерживают вставку (до), тогда как forward_list поддерживают вставку
Последовательные контейнеры STL, такие как vector, deque, list поддерживают вставку для вставки элементов перед заданным итератором для поддержки операторов типа
vector.insert(std::end(container), container2.begin(), container2.end())
Принимая во внимание, что forward_list поддерживает insert_after. Почему сопровождающие STL должны были сделать этот выбор дизайна?
1 ответ
forward_list
реализован в виде односвязного списка. Каждый узел в списке имеет указатель на следующий элемент в списке. (Примечание: указатель здесь является общим термином).
Это означает, что перемещение назад в списке невозможно. Вы можете начать с начала списка и двигаться вперед, пока не найдете элемент, ссылка на который указывает на имеющийся у вас элемент, но это дорого. Вставка в список таким образом является O(N)
операция (в отличие от O(1)
)
Все остальные контейнеры (vector
, string
, deque
, map
, set
, list
и т. д.) все поддерживают перемещение вперед и назад в контейнере, поэтому легко найти элемент "до". forward_list
не.
Что касается имен, было бы более запутанным, если insert(list_iter, x)
вставлен перед list_iter
, но insert(forward_list_iterator, x)
вставлен после позиции. Поэтому дизайнеры дали им разные имена.
[Позже] Это обсуждалось в первоначальном предложении для forward_list
, который можно найти по адресу: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2448.html. Спасибо Говарду Хиннанту за ссылку.