Вектор push_back
амортизировал сложность с постоянным временем, потому что он экспоненциально увеличивает емкость вектора.(Я предполагаю, что вы используете vector, потому что он идеально подходит для этой ситуации.) Однако на практике рендеринг кода очень чувствителен к производительности, поэтому, если push_back
вызывает перераспределение вектора, производительность может снизиться.
Вы можете предотвратить перераспределение, резервируя емкость перед ее добавлением.Если вы наберете myvec.reserve(10);
, вы гарантированно сможете добавить 10 элементов до того, как вектор будет перераспределен.
Однако для этого все же необходимо заранее знать, сколько элементов вам нужно.Кроме того, если вы создаете и уничтожаете множество различных векторов, вы все равно занимаете много памяти.Вместо этого просто используйте one vector для всех вершин и используйте его повторно.Вызов clear()
возвращает его пустым , сохраняя выделенную ему емкость .Таким образом, вам на самом деле не нужно ничего резервировать - первые несколько раз, когда вы его используете, он будет перераспределяться и расти, но как только он достигнет своего пикового размера, ему больше не нужно будет перераспределять.Приятно то, что вектор находит приблизительный размер, который ему нужен, и как только он «подогревается», дальнейшее распределение отсутствует, поэтому это высокая производительность.
Короче говоря:
- Используйте один постоянно сохраненный
std::vector
push_back
столько, сколько хотите - Когда вы закончите,
clear()
.
Inна практике это будет работать так же хорошо, как и массив C, но без жесткого ограничения на размер.