tgoop.com/cpp_geek/309
Create:
Last Update:
Last Update:
🔥 Сегодня я расскажу про одно коварное поведение std::vector
, которое часто становится причиной багов и утечек.
📌 Проблема: Удаление элементов в цикле
Многие делают так:
std::vector<int> v = {1, 2, 3, 4, 5};
for (size_t i = 0; i < v.size(); ++i) {
if (v[i] % 2 == 0) {
v.erase(v.begin() + i);
}
}
Но это ошибка! После
erase
вектор сдвигает все элементы, и индекс i
указывает уже не на тот элемент. В результате часть значений пропускается.✅ Правильный способ — использовать итераторы:
auto it = v.begin();
while (it != v.end()) {
if (*it % 2 == 0)
it = v.erase(it);
else
++it;
}
Так вы не теряете элементы и не получаете неопределённое поведение.
🧠 Советы:
- Всегда помните, что
erase
инвалидирует итераторы и индексы.- Если хотите удалять по условию — лучше использовать
std::remove_if
+ erase
.
v.erase(std::remove_if(v.begin(), v.end(), [](int x) {
return x % 2 == 0;
}), v.end());
➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/309