Вы можете выполнять итерацию, используя индекс доступа,
Чтобы избежать сложности O (n ^ 2)
Вы можете использовать два индекса, i - текущий индекс тестирования, j - индекс для
сохранить следующий элемент и в конце цикла новый размер вектора.
код:
void erase(std::vector<int>& v, int num)
{
size_t j = 0;
for (size_t i = 0; i < v.size(); ++i) {
if (v[i] != num) v[j++] = v[i];
}
// trim vector to new size
v.resize(j);
}
В этом случае у вас нет аннулирования итераторов, сложность O (n), а код очень лаконичен, и вам не нужно писать некоторые вспомогательные классы, хотя в некоторых случаях использование вспомогательных классов может принести пользу в более гибком коде .
Этот код не использует метод erase
, но решает вашу задачу.
Используя чистый stl, вы можете сделать это следующим образом (это похоже на ответ Мотти):
#include <algorithm>
void erase(std::vector<int>& v, int num) {
vector<int>::iterator it = remove(v.begin(), v.end(), num);
v.erase(it, v.end());
}