В C ++ будет ли векторная функция push_back увеличивать размер пустого массива? - PullRequest
5 голосов
/ 15 октября 2011

Быстрый вопрос. Допустим, я объявляю вектор размером 20. А затем я хочу добавить к нему несколько целых чисел, используя push_back.

vector<int> myVector(20);
myVector.push_back(5);
myVector.push_back(14);

Емкость моего вектора теперь 22 или все еще 20? Были ли 5 ​​и 14 добавлены к индексам [19] и [20] соответственно? Или они в [0] и [1]?

Ответы [ 6 ]

12 голосов
/ 15 октября 2011

После этих утверждений его емкость определяется реализацией.(Обратите внимание, что он отличается от своего размера.)


vector<int> myVector(20);

Это создает вектор, заполненный двадцатью 0.Его размер ровно двадцать, а вместимость не менее двадцати.Независимо от того, точно ли это двадцать, определяется реализацией;он может иметь больше (вероятно, нет, на практике).

myVector.push_back(5);

После этого двадцать первый элемент массива равен 5, а емкость снова определяется реализацией.(Если емкость была ровно двадцать раньше, теперь она увеличивается неопределенным образом.)

myVector.push_back(14);

Аналогично, теперь двадцать второй элемент массива равен 14, а емкость определяется реализацией.


Если вы хотите зарезервировать пространство, но не вставлять элементы, вы сделаете это следующим образом:

vector<int> myVector;
myVector.reserve(20); // capacity is at least twenty, guaranteed not
                      // to reallocate until after twenty elements are pushed

myVector.push_back(5); // at index zero, capacity at least twenty.
myVector.push_back(14); // at index one, capacity at least twenty.
3 голосов
/ 15 октября 2011
  • size - количество элементов в векторном контейнере.
  • capacity - размер выделенного пространства хранения
  • push_back эффективно увеличивает размер вектора на единицу, что вызывает перераспределение внутренней выделенной памяти, если размер вектора был равен емкости вектора перед вызовом.

Дополнительная информация: http://www.cplusplus.com/reference/stl/vector/

1 голос
/ 15 октября 2011

push_back увеличит емкость вектора, по крайней мере, до нового размера вектора, но, возможно, (то есть, вероятно) несколько больше.

Поскольку push_back требуется для работы в O (1) амортизированное время, каждое перераспределение будет кратно старой емкости.В типичной реализации это кратно 2.

Но точное увеличение емкости не указано.Если вам требуется точный контроль над емкостью, используйте reserve.

...

Перечитывая ваш вопрос, я не уверен, что вы понимаете разницу между размером вектора и его емкостью,Размер - это количество элементов.Емкость - это количество элементов, которые вектор может содержать без перераспределения.То есть, вы можете push_back Емкость () - размер () элементов до того, как произойдет перераспределение.

В вашем примере 5 и 14 появятся в myVector [20] и myVector [21] соответственно.

1 голос
/ 15 октября 2011

Ну, vector имеет функцию-член push_back.Другие последовательности, такие как deque, имеют push_front.

0, 1, 2, ......, окончательный

после добавления:

0, 1, 2, ....., final, сложение, ...

Вы можете вспомнить, что:

capacity() returns the number of elements in the vector sufficient,
without allocating additional memory.
This number can be greater or equal to size.

То есть нельзя добавлять спередиили середина, поскольку vector специализирован для быстрого доступа к элементам по индексу.Если вы хотите добавить спереди и сзади, вы можете использовать deque, что похоже на vector.Если вы хотите добавить спереди, сзади и везде, вы можете использовать list.Обратите внимание, что list не обеспечивает индексацию, такую ​​как deque и vector.

Однако предполагается, что вектор имеет большую емкость, чем его фактический размер.Когда вы добавляете к нему элементы, нет необходимости выделять дополнительную память.Это возможно, только если емкость равна размеру.На многих компиляторах новая емкость будет вдвое больше старой.После размещения он копирует все элементы в новом месте.Однако такое поведение может быть дорогим с точки зрения памяти.

1 голос
/ 15 октября 2011

Поскольку вектор не является пустым , но имеет размер 20 (содержит 20 элементов) и вы push 2 элемента для back, теперь он содержит 22 элемента.Но новые элементы размещаются не в индексах 19 и 20, а в 20 и 21.

Если вы действительно хотите зарезервировать достаточно памяти, чтобы вектор содержал 20 элементов (без каких-либо элементов), чтобы предотвратитьдорогостоящие перераспределения, тогда вы должны позвонить

std::vector<int> myVector;
myVector.reserve(20);

. В этом случае вектор все еще пуст, но у него достаточно памяти, чтобы добавить как минимум 20 элементов (например, push_back) без необходимости перераспределения еговнутренняя память.В этом случае вектор содержит только 2 элемента, которые вы push ed _back.

1 голос
/ 15 октября 2011

push_back увеличивает размер std::vector и помещает новые элементы в конец vector (другие контейнеры также имеют метод push_front для того же действия на передней панели).

Однако существует разница между размером и емкостью vector.Размер указывает на то, сколько предметов на самом деле сейчас находится в vector; емкость относится к общему количеству элементов, которые vector может хранить без перераспределения памяти.Память reserve() возможна, если вы знаете, что собираетесь добавить несколько элементов, и не хотите увеличивать фрагмент vector.

...