Эффективность вектора c ++ Vector - PullRequest
0 голосов
/ 19 октября 2019

Стандарт требует, чтобы векторные реализации могли эффективно добавлять элементы во время выполнения. Поскольку векторы растут эффективно, зачастую нет необходимости - и это может привести к ухудшению производительности - для определения вектора определенного размера. Исключением из этого правила является то, что на самом деле все элементы нуждаются в одинаковом значении. Если требуются разные значения элементов, обычно более эффективно определить пустой вектор и добавить элементы в качестве значений, которые нам нужны, чтобы стать известными во время выполнения.

Чтение в простом C ++ (издание C ++ 11),Может кто-нибудь объяснить мне, почему это так. Я имею в виду, что нам нужно добавить где-то 1 миллион разных чисел в std :: vector. Почему, если я вставлю их обратно в вектор, который не определил приблизительный размер, будет более "эффективным" способом, чем определение размера ? Я имею в виду, что у меня есть смутное представление о размере и емкости вектора, и я считаю, что каждый раз, когда Vector превышает его емкость, все элементы копируются в массив большего размера (n * 2 или n * 1.5 где-то по соседству) ...

1 Ответ

0 голосов
/ 19 октября 2019

Для простых типов, таких как целые, объявление вектора с количеством необходимых элементов, скорее всего, будет быстрее, чем использование push_back, потому что вектору не нужно делать никаких перераспределений. Однако со сложными классами, имеющими конструкторы, выполнение по умолчанию будет конструировать все элементы по умолчанию, а затем перезаписывать их, тратя время.

В обоих случаях наилучшим решением будет использование reserve для выделения пространства длявсе элементы сразу, не создавая эти элементы. Тогда вы можете использовать push_back, не беспокоясь о перераспределении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...