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
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 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;
}