Всегда ли push_back () увеличивает размер вектора? - PullRequest
3 голосов
/ 11 ноября 2010

У меня есть фрагмент кода, который создает std :: vector с известным размером:

std::vector<T> vectorOfTs(n);

Увеличивает ли вызов push_back размер до n + 1?

vectorOfTs.push_back(T());

Ответы [ 4 ]

19 голосов
/ 11 ноября 2010

Да; обратите внимание, что vector<T>.capacity() отличается от vector<T>.size(). Последний обозначает количество элементов, находящихся в данный момент в векторе, тогда как первый представляет количество элементов, которые помещаются в пространство, выделенное для внутреннего буфера вектора.

9 голосов
/ 11 ноября 2010

Почти. Если исключений нет, то size() будет увеличиваться.

push_back(T()) также может выдавать исключение на различных этапах: см. здесь или в общем:

  • T() конструкция, в этом случае вызов push_back не происходит, и size() не изменяется

  • , если vector нужно увеличить емкость, это может произойти, в этом случае size() не затрагивается

  • элемент vector будет скопирован или перемещен с использованием std::allocator_traits<A>::construct(m, p, v);, если A равно std::allocator<T>, то это вызовет размещение- new, как ::new((void*)p) T(v): если любой из vector size() не влияет, **** если ***

    • конструктор перемещения не noexcept и выполняет бросок: в этом случае эффекты не определены
  • затем обновление вектора будет завершено - size() будет увеличиваться, и значение будет в vector (даже если T::~T())

4 голосов
/ 11 ноября 2010

Да.Если вместо этого вы хотите зарезервировать место, вызовите Reserve (), например:

std::vector<T> vectorOfTs;
vectorOfTs.reserve(n);
// now size() == 0, capacity() >= n

vectorOfTs.push_back(T());
// now size() == 1
0 голосов
/ 11 ноября 2010

Да.

std::vector<T> vectorOfTs(n);

В приведенном выше утверждении фактически вы создаете 'n' число новых экземпляров типа T (то есть конструктор по умолчанию T () будет запускаться каждый раз). Теперь вектор vectorOfTs содержит n элементов. Следующая версия конструктора вектора будет вызвана для вышеуказанного оператора.

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

Итак, когда вы возвращаете другой элемент в вектор, размер вектора будет n + 1.

...