Есть средний случай, когда вы используете reserve()
, а затем звоните push_back()
много раз. Это всегда будет по крайней мере так же эффективно, как просто вызвать push_back()
, если вы знаете, сколько элементов нужно вставить.
Преимущество вызова reserve()
вместо resize()
состоит в том, что ему не нужно инициализировать участников, пока вы не собираетесь писать им. Если у вас есть вектор объектов класса, который нуждается в построении, это может быть дороже, особенно если конструктор по умолчанию для каждого элемента нетривиален, но даже тогда это дорого.
Затраты на вызов push_back, однако, заключаются в том, что каждый раз, когда вы вызываете его, ему необходимо сверять текущий размер с пропускной способностью, чтобы увидеть, нужно ли ему перераспределять.
Так что это случай N инициализаций против N сравнений. Когда тип имеет тип int, вполне может быть оптимизация с инициализацией (memset или чем-то еще), позволяющая это сделать быстрее, но с объектами я бы сказал, что сравнения (reserve и push_back) почти наверняка будут быстрее.