HustleCoder
@HustleCoder

Удаление элементов из вектора (STL). В чем ошибка?

Задаю массив целых чисел, хочу удалить все нули из него. Для этого использую функцию erase. Поскольку при удалении все элементы сдвигаются, возвращаю итератор на шаг назад (iter--). Почем так не работает и как правильно удалять произвольные элементы из вектора? (или никак и надо использовать другой контейнер?)
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> mas;
    vector<int>::iterator iter;
    int N{0}, temp{0};
    cout << "An array's size - ";
    cin >> N;
    for(int i = 0; i < N; ++i)
    {
        cin >> temp;
        mas.push_back(temp);
    }
    for(iter = mas.begin(); iter != mas.end(); ++iter)
    {
        if (*iter == 0)
        {
            mas.erase(iter);
            iter--;
        }
    }
    for(iter = mas.begin(); iter != mas.end(); ++iter)
    {
        cout << *iter << " ";
    }

    return 0;
}
  • Вопрос задан
  • 2589 просмотров
Решения вопроса 2
Adamos
@Adamos
Сменить for на while и в случае удаления
iter = mas.erase(iter);
иначе
iter++;
Ответ написан
Комментировать
myjcom
@myjcom Куратор тега C++
как правильно удалять произвольные элементы из вектора

для встроенных
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	
	vector<int> v{1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 9, 0};
	v.erase(remove(v.begin(), v.end(), 0), v.end());

   // или
   // auto it = stable_partition(v.begin(), v.end(), [](int n){ return n != 0;}); // or partition
   // v.erase(it, v.end());

	for(int i : v)
	{
		cout << i << " ";
	}
}


или никак и надо использовать другой контейнер?

Не то что никак, вставка и удаление элементов в векторе везде кроме конца - просто неэффективна.

Если не нужен быстрый произвольный доступ можно использовать std::list или даже std::forward_list

или даже std::unordered_multiset
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы