Nađi grešku: brisanje tokom obilaska

Funkcija obrisi_parne treba iz liste da izbaci sve parne brojeve. Za listu 1 2 4 5 6 7 očekuje se 1 5 7. Funkcija iz postavke se prevodi bez upozorenja, ali ne radi.

void obrisi_parne(std::list<int>& l)
{
    for (auto it = l.begin(); it != l.end(); ++it)
        if (*it % 2 == 0)
            l.erase(it);
}

Objasniti šta je pogrešno i ispraviti funkciju. Zatim istu ispravnu petlju napisati i nad klasom DvostrukaLista, sa pokazivačem na čvor umesto iteratora:

void obrisi_parne(DvostrukaLista<int>& l);

Oba rešenja moraju da budu $O(n)$.

g++ -std=c++17 -Wall -Wextra -g main.cpp
g++ -std=c++17 -Wall -Wextra -g -fsanitize=address,undefined main.cpp

Pitanje za razmišljanje: Šta vraća erase, i šta u verziji sa DvostrukaLista igra tu ulogu?

Ulaz

U prvom redu učitava se broj n $(0 \le n \le 10^5)$, a zatim n celih brojeva.

Izlaz

U prvom redu ispisati preostale elemente posle brisanja iz std::list, a u drugom posle brisanja iz DvostrukaLista.

Primer

Ulaz

6
1 2 4 5 6 7

Izlaz

1 5 7
1 5 7

Postavka

main.cpp

#include <iostream>
#include <list>

#include "dvostruka_lista.h"

namespace matf {

    // Brise sve parne brojeve iz liste.
    void obrisi_parne(std::list<int>& l)
    {
        for (auto it = l.begin(); it != l.end(); ++it)
            if (*it % 2 == 0)
                l.erase(it);
    }

    // Brise sve parne brojeve iz liste.
    void obrisi_parne(DvostrukaLista<int>& l)
    {
        // Ovde ide vasa implementacija
    }

} // namespace matf

int main()
{
    int n;
    std::cin >> n;

    std::list<int> a;
    DvostrukaLista<int> b;
    for (int i = 0; i < n; ++i) {
        int x;
        std::cin >> x;
        a.push_back(x);
        b.dodaj_na_kraj(x);
    }

    matf::obrisi_parne(a);
    for (int x : a)
        std::cout << x << " ";
    std::cout << std::endl;

    matf::obrisi_parne(b);
    for (int x : b)
        std::cout << x << " ";
    std::cout << std::endl;

    return 0;
}