Скорость роста емкости вектора зависит от реализации.Реализации почти всегда выбирают экспоненциальный рост, чтобы удовлетворить требование амортизированное постоянное время для операции push_back
.Что означает амортизированное постоянное время и как экспоненциальный рост достигает этого, интересно.
Каждый раз, когда емкость вектора увеличивается, элементы необходимо копировать.Если вы «амортизируете» эту стоимость в течение срока службы вектора, то получается, что если вы увеличиваете емкость на экспоненциальный коэффициент, вы в итоге амортизируете постоянные затраты.
Это, вероятно, кажется немного странным,поэтому позвольте мне объяснить вам, как это работает ...
- размер: 1 емкость 1 - элементы не были скопированы, стоимость одного элемента для копий равна 0.
- размер:2 емкость 2 - Когда емкость вектора была увеличена до 2, первый элемент должен был быть скопирован.Среднее количество копий на элемент составляет 0,5
- размер: 3 емкости 4 - Когда емкость вектора была увеличена до 4, первые два элемента пришлось скопировать.Среднее количество копий на элемент составляет (2 + 1 + 0) / 3 = 1.
- размер: 4 емкости 4 - Среднее количество копий на элемент составляет (2 + 1 + 0 + 0) / 4 = 3/4 =0,75.
- размер: 5 емкостей 8 - Среднее количество копий на элемент составляет (3 + 2 + 1 + 1 + 0) / 5 = 7/5 = 1,4
- ...
- размер: 8 емкостей 8 - Среднее количество копий на элемент (3 + 2 + 1 + 1 + 0 + 0 + 0 + 0) / 8 = 7/8 = 0,875
- размер: 9 емкостей 16- Среднее количество копий на элемент составляет (4 + 3 + 2 + 2 + 1 + 1 + 1 + 1 + 0) / 9 = 15/9 = 1,67
- ...
- размер 16емкость 16 - среднее количество копий на элемент равно 15/16 = 0,938
- размер 17 емкость 32 - среднее количество копий на элемент составляет 31/17 = 1,82
Как видно, каждый раземкость увеличивается, количество копий увеличивается на предыдущий размер массива.Но поскольку размер массива должен удвоиться, прежде чем емкость снова увеличится, количество копий на элемент всегда остается меньше 2.
Если вы увеличили емкость на 1,5 * N вместо 2 * N, выв конечном итоге получился бы очень похожий эффект, за исключением того, что верхняя граница для количества копий на элемент была бы выше (я думаю, что это будет 3).
Я подозреваю, что реализация выберет 1,5 вместо 2, чтобы сэкономить немногопространства, но и потому, что 1,5 ближе к золотое сечение .У меня есть интуиция (которая в настоящее время не подкреплена какими-либо достоверными данными), что скорость роста в соответствии с золотым сечением (из-за его связи с последовательностью Фибоначчи) окажется наиболее эффективной скоростью роста для реальных нагрузок.с точки зрения минимизации как используемого дополнительного пространства, так и времени.