• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak usunąć obiekt z listy <list> C++

Object Storage Arubacloud
0 głosów
1,248 wizyt
pytanie zadane 22 listopada 2017 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)

Witam nie mogę sobie poradzić z funkcją remove stosowaną do list

mam obiekt Klient który przechowywuje zmienne imię, oraz nazwisko

Kilku takich klientów jest zapisanych na listę lista_klientow

nie mam pojęcia jak usunąć klienta o wybranym nazwisku z listy
Za wikipedią: void remove(const T& wartosc)
próbowałem lista_klientow("Kowalski") ale to nie działa bo klient jest obiektem

1 odpowiedź

+2 głosów
odpowiedź 23 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Cześć,

wydaje mi się, że nie masz przeładowanych operatorów dlatego lista nie może sobie poradzić z usunięciem obiektu. Spróbuj tak. Utwórz klasę:

class  ID
{
public:
    string imie;
    string nazwisko;
    bool operator ==(const ID& dane) const { return imie == dane.imie && nazwisko == dane.nazwisko;}
    bool operator !=(const ID& dane) const{return !operator==(dane); }
};

Tu masz przeładowane dwa operatory == oraz !=. Możesz sobie wprowadzić własne warunki w zależności od problemu.

Następnie tworzysz wartość, która ma być usunięta z listy np. tak

 ID dane_do_usuniecia;
    dane_do_usuniecia.imie = "Jan";
    dane_do_usuniecia.nazwisko = "Kowalski";
    lista.remove(dane_do_usuniecia);

 

komentarz 24 listopada 2017 przez Łukasz Michalski Użytkownik (560 p.)

Powiedzmy mam listę klientów, robię kopię jednego klienta z tej listy, i chcę wrzucić go do funkcji remove() to nie działa


void Usun_klienta(string klient_1)
{
    Klient karamba;
for(list<Klient>::iterator i=lista_klientow.begin(); i!= lista_klientow.end(); ++i)
    {  karamba=*i;
       if(karamba.nazwisko==klient_1)
       {
           lista_klientow.remove(karamba);
       }
       }
       }

Coś takiego mi nie działa (brak odpowiedzi)

 

void Usun_klienta(string klient_1)
{
    Klient karamba;
    Klient nowy
for(list<Klient>::iterator i=lista_klientow.begin(); i!= lista_klientow.end(); ++i)
    {  karamba=*i;
       if(karamba.nazwisko==klient_1)
       {
       cin<<nowy.imie;    //podaj imie klienta ktory ma byc usuniety
       cin<<nowy.nazwisko; //podaj nazwisko klienta ktory ma byc usuniety
           lista_klientow.remove(nowy);
       }
       }
       }

A coś takiego już poprawnie usuwa element z listy
 

komentarz 24 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Powiem szczerze, że nie wiem za bardzo co jest złego.

Spróbuj działać bezpośrednio na obiekcie

void Usun_klienta(string klient_1)
{
 
for(list<Klient>::iterator i=lista_klientow.begin(); i!= lista_klientow.end(); ++i)
    {  
       if((*i).nazwisko==klient_1)
       {
           lista_klientow.remove(karamba);
       }
       }
       }

BTW

Po co przechodzić przez całą pętle. Nie łatwiej by Ci było:

void Usun_klienta(string imie, string nazwiso)
{
    Klient karamba;
   karamba.imie = imie;
  karamba.nazwisko = nazwisko;
lista_klientow.remove(karamba);
       }

lub bezpośrednio jako argument użyć obiekt Klient

void Usun_klienta(Klient doUsuniencia) {

lista_klientow.remove(doUsuniencia);

}

Nie ma w ogóle sensu używania pętli for()

komentarz 25 listopada 2017 przez Łukasz Michalski Użytkownik (560 p.)

No tak, na początku chciałem stworzyć kod gdzie podawałbym samo nazwisko klienta, pętla przechodziłaby po całej liście i po znalezieniu klienta o tym nazwisku kopiowałbym go do zmiennej typu Klient którego chciałem użyć do funkcji remove(). Jak przestalo działać to po prostu przeładowałem operatory tak żeby porównywały samo nazwisko w obiektach, i tak to rozwiązałem, a cała pętla już została

Myślałem, że jest jakiś powód dla którego nie mogę wsadzić obiektu z listy do funkcji remove() ale widocznie coś musiałem zepsuć w kodzie, a jest tego kilkaset linijek :D

Dzięki wielkie za ten kod
 

void Usun_klienta(string imie, string nazwiso)
{
    Klient karamba;
   karamba.imie = imie;
  karamba.nazwisko = nazwisko;
lista_klientow.remove(karamba);
       }

Człowiek widzi, ile się musi jeszcze nauczyć bo efekt ten sam, a prostota aż mnie przeraża, żadnych pętli, ani if`ów a robi to co powinno :D

komentarz 25 listopada 2017 przez Bondrusiek Maniak (61,370 p.)

Pamiętaj aby dążyć do jak najprostszego kodu. Wtedy bd łatwiej się pracować Tobie oraz ewentualnym wspólnikom. Co do

Myślałem, że jest jakiś powód dla którego nie mogę wsadzić obiektu z listy do funkcji remove() ale widocznie coś musiałem zepsuć w kodzie, a jest tego kilkaset linijek :D

to polecam pisać nie od razu cały program lecz rozbicie go na moduły i testować. Wtedy łatwiej ogarnąć program. Do sprawdzenie poprawności programu służy debugger

https://pl.wikipedia.org/wiki/Debugger

Obczaj go sobie w Twoim IDE powinno to ułatwić testowanie programu.

komentarz 25 listopada 2017 przez Łukasz Michalski Użytkownik (560 p.)
znaczy mam debuggera, i w programie ustawiłem sobie menu na zasadzie uzytkownik wybiera, opcje, a program wykonuje na raz max 1-2 funkcje.
 

Debugera znam, nawet czasami zdarza mi się skorzystać :D

Dzięki za pomoc, i za wszystkie rady :D

Podobne pytania

0 głosów
0 odpowiedzi 1,659 wizyt
pytanie zadane 13 stycznia 2018 w Java przez Kasia Nowicjusz (230 p.)
0 głosów
2 odpowiedzi 605 wizyt
pytanie zadane 8 czerwca 2017 w C# przez liledusty Obywatel (1,430 p.)
0 głosów
1 odpowiedź 187 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez mmr0429 Bywalec (2,010 p.)

92,551 zapytań

141,400 odpowiedzi

319,531 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...