C++ самый быстрый способ очистить или стереть вектор

У меня есть код, где я обычно заполняю вектор от 0 до 5000 элементов. Я знаю, что максимум никогда не превышает 5000. Вместо того, чтобы инициализировать вектор несколько раз, я хотел бы сделать только один раз

vector<struct> myvector;
myvector.reserve(5000);

однако, чтобы снова заполнить вектор, я должен сначала очистить вектор, не изменяя его емкость. Поэтому обычно я звоню myvector.clear();

это операция O(n). Есть что-то простое я могу сделать, чтобы увеличить производительность или это о лучшем, что он получит?

3 ответов


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


стоимостью clear() во многом зависит от того, что представляют собой хранимые объекты, и, в частности, имеют ли они тривиальный деструктор. Если тип не имеет тривиального деструктора, то вызов должен уничтожить все сохраненные объекты, и это фактически операция O(n), но вы не можете сделать ничего лучше.

теперь, если сохраненные элементы имеют тривиальные деструкторы, то реализация может оптимизировать стоимость и clear() становится дешевой операцией O (1) (просто сброс размер --end указатель).

помните, что для понимания асимптотической сложности вам нужно знать, о чем она говорит. В случае clear() Он представляет собой количество вызываемых деструкторов, но если стоимость (скрытая) равна 0, то операция является no-op.


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

остается только вопрос о том, какие предметы хранятся в векторе. Если вы храните что-то вроде int что компилятор может / будет знать заранее, не имеет деструктора для вызова, шансы, по крайней мере, довольно хорошие, что удаление закончится постоянные сложности.

Я сомневаюсь, однако, что изменение синтаксиса (например,clear() и resize() и erase(begin(), end())) будет иметь какое-либо существенное значение вообще. Синтаксис не меняет того факта, что(при отсутствии потоковой передачи) вызов N деструкторов является операцией O (N).