Количество копий, выполненных для std::vector/deque ::insert
и т. Д., Пропорционально количеству элементов между положением вставки и концом контейнера (количество элементов, которые необходимо сместить, чтобы освободить место).Наихудший случай для std::vector
- O(N)
- при вставке в переднюю часть контейнера.Если вы вставляете M
элементов, то наихудшим случаем будет O(M*N)
, что не очень хорошо.
Может также произойти перераспределение, если емкость контейнеров будет превышена.Вы можете предотвратить перераспределение, убедившись, что достаточно места было ::reserve
впереди.
Другое предложение - лучше скопировать во второй контейнер std::vector/deque
, так как его всегда можно организовать для достижения сложности O(N)
, но за счет временного хранения двух контейнеров.
Использование std::list
позволит вам получить вставки O(1)
на месте, но за счет дополнительных накладных расходов на память (хранение указателей на список и т. Д.) И уменьшенной локальности памяти (узлы списка не выделяются непрерывно).Вы можете улучшить локальность памяти, используя распределитель памяти пула (Boost pool может быть?).
В целом вам придется провести тест, чтобы по-настоящему разобраться, какой из них «самый быстрый»подход.
Надеюсь, это поможет.