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

Jak używać metody erase w odlienieniu do klasy list?

0 głosów
791 wizyt
pytanie zadane 7 maja 2018 w C i C++ przez k222 Nałogowiec (30,150 p.)

Cześć, bawię się właśnie klasą list, dzięki której można zrobić gotową listę bez baweinia się w dodawanie, usuwanie itp. tylko przystawiła mnie metoda erase ponieważ za chiny mi nie chce takie coś działać:

 for (std::list<int>::iterator it=mylist.begin(); it != mylist.end(); ++it)
        {
            if (*it == val)
                tab[i].erase(it);
        }

Generalnie chodzi o to że mamy jakąś tablicę list tab

list<int> *tab;
tab = new list<int>[n];

i chciałem z jej i-tej listy usunąć element o wartości równej val i zrobiłem taką pętlę i nie bardzo wiem jak zastosować teraz metodę erase bo w takim wydaniu jak powyżej nie usuwa ona elementu

3 odpowiedzi

+1 głos
odpowiedź 7 maja 2018 przez adrian17 Mentor (355,180 p.)
wybrane 8 maja 2018 przez k222
 
Najlepsza

Swoją drogą, jeśli już używasz kontenerów biblioteki standardowej, lepiej do większości zastosowań przerzucić się na std::vector.

list<int> mylist;
vector<int> vec;

Swoją drogą [2], skoro już używasz kontenery zarządzające pamięcią, zamiast ręcznego alokowania new[n], można to też zastąpić kontenerem:

tab = new list<int>[n];
// ->
vector<list<int>> tab(n); // albo
vector<vector<int>> tab(n);

W każdym razie, do sedna. Dla uproszczenia zignoruję tablicę i usunę z `mylist`.

for (auto it = mylist.begin(); it != mylist.end(); )
{
    if (*it == val)
        it = mylist.erase(it);
    else
        ++it;
}


Z iteratorami trochę trudno się to czyta, fakt.

Natomiast jeśli chcesz usunąć tylko jeden element (albo wiesz, że będzie tylko jeden), to wystarczy std::find z biblioteki <algorithm>:

    auto it = std::find(mylist.begin(), mylist.end(), val);
    if (it != mylist.end())
        mylist.erase(it);

Do usunięcia wielu elementów można też użyć takiego magicznego one-linera:

mylist.erase(std::remove(mylist.begin(),mylist.end(),val),mylist.end());

 

komentarz 7 maja 2018 przez Hiskiel Pasjonat (22,830 p.)
a dlaczego, skoro to wskaźnik stosuje . a nie -> ?
komentarz 7 maja 2018 przez adrian17 Mentor (355,180 p.)

skoro to wskaźnik

Co masz na myśli przez "to"?

komentarz 7 maja 2018 przez Hiskiel Pasjonat (22,830 p.)
Przepraszam, ta lista, tab*
komentarz 7 maja 2018 przez adrian17 Mentor (355,180 p.)

Dla uproszczenia zignoruję tablicę i usunę z `mylist`.

Jak masz tablicę/vector list/vectorów, to użyj tab[x] zamiast mylist.

+1 głos
odpowiedź 7 maja 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Usuwanie powinno działać. Natomiast jak usunąłeś element z listy przy użyciu iteratora, to nie używaj więcej tego iteratora.
+1 głos
odpowiedź 7 maja 2018 przez RafalS VIP (122,780 p.)

Podobne pytania

0 głosów
2 odpowiedzi 922 wizyt
pytanie zadane 6 stycznia 2018 w C i C++ przez Łukasz Michalski Użytkownik (560 p.)
0 głosów
2 odpowiedzi 1,460 wizyt
pytanie zadane 11 maja 2017 w C i C++ przez Isild Użytkownik (620 p.)
0 głosów
1 odpowiedź 788 wizyt
pytanie zadane 19 października 2021 w C i C++ przez Vifuso Nowicjusz (170 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...