У меня есть «список» объектов, из которого я хочу взять объект в произвольном положении и выдвинуть его перед этим списком. Только такая операция будет выполнена. Поэтому мне не нужен быстрый доступ к концу списка, только к его переднему и среднему доступу к любому другому месту.
Какой контейнер будет лучшим для этого? Я думал о std::vector
, но я прочитал это insert
операция не эффективна. Потом я придумал std::deque
из-за его быстрого доступа к фронту, но как насчет эффективности его erase
на конкретный метод позиции?
Заранее спасибо за помощь.
Мы можем дать вам рекомендации, но не дать однозначного ответа — вам нужно сравнить их самостоятельно, потому что это в решающей степени зависит от вашей коллекции и размера объекта:
std::vector
будет быстрее, потому что даже если вам нужно скопировать больше данных, лучшее время произвольного доступа (O (1) против O (n) для std::list
) и локальность кэша будет доминировать.std::list
будет быстрее, потому что хотя вам нужно O (n), чтобы выбрать случайный объект, вставка будет намного быстрее, так как копирование многих крупных объектов происходит очень медленно.Но в чем именно заключается разрыв между этими двумя сценариями, я не могу сказать.
Кроме того, если вы можете сойти с рук обменивать элементы вместо вставки, это не просто: всегда используйте std::vector
,
На основании этого ответа: https://stackoverflow.com/a/471481/1284631 (а также на этом: https://stackoverflow.com/a/471461/1284631) Я бы пошел за списком. Дешево добавлять, повторять, вставлять и удалять.
PS: Это зависит, если случайная позиция основана на индексе или нет (то есть, если вы знаете, численно какая позиция или объект, который нужно переместить в начало, приводит к итерации по списку и проверке его свойств).
Итак: если позиция известна без повторения списка, то перейдите к вектору.
если позиция требует итерации по коллекции, перейдите к списку.