Предполагая, что вы имеете в виду push_back
, а не вставку, я считаю, что важной частью является умножение на некоторую константу (в отличие от захвата еще N элементов каждый раз), и если вы сделаете это, вы получите амортизированное постоянное время , Изменение коэффициента приводит к изменению среднего и наихудшего показателей производительности.
В частности:
Если ваш постоянный коэффициент слишком велик, вы будете иметь хорошую среднюю производительность в случае, но худшую в худшем случае, особенно, когда массивы станут большими. Например, представьте себе удвоение (2x) вектора размером 10000 только потому, что вы выдвинули 10001-й элемент. РЕДАКТИРОВАТЬ: Как косвенно указал Майкл Барр, реальная стоимость здесь, вероятно, заключается в том, что вы увеличите объем памяти намного больше, чем нужно. Я хотел бы добавить к этому, что есть проблемы с кешем, которые влияют на скорость, если ваш фактор слишком велик. Достаточно сказать, что есть реальные затраты (память и вычисления), если вы становитесь намного больше, чем вам нужно.
Однако, если ваш постоянный коэффициент слишком мал, скажем, (1,1x), то у вас будет хорошая производительность в худшем случае, но плохая средняя производительность, потому что вам придется нести затраты на перераспределение слишком много раз. .
Также см. Ответ Джона Скита на аналогичный вопрос ранее. (Спасибо @Bo Persson)
Еще немного об анализе: скажем, у вас есть n
предметов, которые вы отбрасываете назад, и коэффициент умножения M
. Тогда количество перераспределений будет примерно равно логической базе M
из n
(log_M(n)
). А i
-ое перераспределение будет стоить пропорционально M^i
(M
к i
-ой степени). Тогда общее время всех откатов будет M^1 + M^2 + ... M^(log_M(n))
. Количество откатов равно n
, и, таким образом, вы получаете эту серию (которая является геометрической серией и сокращается примерно до (nM)/(M-1)
в пределе), деленную на n
. Это примерно константа, M/(M-1)
.
При больших значениях M
вы будете сильно превышать допустимые пределы и выделять гораздо больше, чем вам нужно, достаточно часто (о чем я упоминал выше). Для малых значений M
(близких к 1) эта константа M/(M-1)
становится большой. Этот фактор напрямую влияет на среднее время.