Несколько других комментариев в дополнение к ответу Реми Лебо.
Передача итератора STL по значению так же эффективна, как и по ссылке, поэтому единственная причина, по которой вам нужно будет передать один итератор по ссылке, - это когда вынамереваетесь изменить индекс, и вы хотите, чтобы это изменение было видно в области действия вызывающего.(Например, анализатор UTF-8 должен потреблять от одного до четырех байтов.) Поскольку этот код не должен этого делать, лучше просто передать итератор по значению.
ВВ общем, если вы не изменяете переменную, которую вы передаете по ссылке, вы должны вместо этого передать const
ссылку.В случае Enemy::TakeDamage()
единственное, что вы делаете с итератором, это разыменовываете его, так что вы можете просто передать Enemy&
и вызвать его с *i
в качестве параметра.
Алгоритм не очень эффективен: если вы удаляете много элементов в начале списка, вам нужно будет переместить все оставшиеся элементы массива несколько раз.Это работает в O(N²)
время.A std::list
, хотя и имеет большие накладные расходы по сравнению с std::vector
, может удалять элементы за постоянное время и может быть более эффективным, если у вас много вставок и удалений, которые не находятся в конце.Вы также можете рассмотреть возможность перемещения только тех объектов, которые сохранились, в новый список, а затем уничтожить старый.По крайней мере, таким образом, вам нужно копировать только один раз, и ваш проход выполняется за O(N)
раз.
Если ваши контейнеры хранят умные указатели на объекты, вам нужно только переместить указатели на новое место,не весь объект.Это не компенсирует накладные расходы большого количества выделений кучи, если ваши объекты маленькие, но может сэкономить вам большую пропускную способность, если они большие.Объекты по-прежнему будут автоматически удаляться при удалении последней ссылки на них.