[C++] STL i klasa list
- grigorij89
- Piegowaty Guziec
- Posty: 5
- Rejestracja: 05 gru 2010, 22:33
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
[C++] STL i klasa list
Mam problem z takim oto programem:
- mam napisać funkcje usuwającą co 3 element w liście
Do dyspozycji mam klasę list. Wydaje mi się ,że muszę skorzystać z metody remove_if(). Ale mam z tym problem ,szczególnie że tam w parametrze ma być inna funkcja co zwraca bool'a. I to będzie kluczowe w tym programie.
Mógłby ktoś coś podsunąć albo jakoś naprowadzić mnie( mile widziany kodzik przykładowy)
z góry dziękuję za wysiłek i czas
- mam napisać funkcje usuwającą co 3 element w liście
Do dyspozycji mam klasę list. Wydaje mi się ,że muszę skorzystać z metody remove_if(). Ale mam z tym problem ,szczególnie że tam w parametrze ma być inna funkcja co zwraca bool'a. I to będzie kluczowe w tym programie.
Mógłby ktoś coś podsunąć albo jakoś naprowadzić mnie( mile widziany kodzik przykładowy)
z góry dziękuję za wysiłek i czas
- Struchu
- Serdeczny Borsuk
- Posty: 116
- Rejestracja: 23 mar 2008, 19:58
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: [C++] STL i klasa list
Niekoniecznie: poczytaj o metodzie erase i o iteratorach. Plus do tego prosty warunek:
i cały program gotowy
Kod: Zaznacz cały
if(i % 3 == 0)
i cały program gotowy

Ma zielone, kocie oczy...
- grigorij89
- Piegowaty Guziec
- Posty: 5
- Rejestracja: 05 gru 2010, 22:33
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Odp: [C++] STL i klasa list
Ok dzięki za info. Mam jednak właśnie problem z dostępem do co 3 elementu ,dajmy na to takie coś :
jak wskazywać(bo Iter to defakto chyba wskaźnik) na co 3 element, tak żebym mógł np. usuwać albo wyświetlać tylko co 3 ??
Szczególnie że czytałem ,że iterator klasy list nie jest iteratorem o dostępie swobodnym więc arytmetyka wskaźników nie działa
Kod: Zaznacz cały
int main ()
{
list <int> c1;
list <int>::iterator Iter;
c1.push_back( 10 );
c1.push_back( 20 );
c1.push_back( 30 );
c1.push_back( 40 );
c1.push_back( 50 );
cout << "Iterator:" << endl;
for( Iter = c1.begin( ); Iter != c1.end( ); Iter++ )
cout << " " << *Iter;
cout << endl;
return 0;
}
Szczególnie że czytałem ,że iterator klasy list nie jest iteratorem o dostępie swobodnym więc arytmetyka wskaźników nie działa

- Struchu
- Serdeczny Borsuk
- Posty: 116
- Rejestracja: 23 mar 2008, 19:58
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
Odp: [C++] STL i klasa list
Wprowadź dodatkowy licznik, który będziesz inkrementował przy każdym obrocie pętli. Jeśli dotrze on do wartości podzielnej przez 3 (albo dzielącej się przez 3 z określoną resztą - w zależności, które konkretnie elementu chcesz usuwać), to usuwasz element.
Ma zielone, kocie oczy...
- panjandrum
- Sędziwy Jeż
- Posty: 37
- Rejestracja: 31 lip 2007, 10:05
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: Openbox
- Architektura: x86
Re: [C++] STL i klasa list
A może lepszym wyborem jest tu wektor, zamiast listy. Będziesz miał wtedy bezpośredni dostęp do elementów.
- grigorij89
- Piegowaty Guziec
- Posty: 5
- Rejestracja: 05 gru 2010, 22:33
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Re: [C++] STL i klasa list
Ok dodałem taką pętelkę
i się sypie wyskakuje błąd podczas wykonywania programu . Podejrzewam że jest to spowodowane tym , że usuwam element i nie przepinam chyba tych co nie usunąłem. Pomoże ktoś??
Kod: Zaznacz cały
int licznik =0;
for( Iter = c1.begin();Iter != c1.end();Iter++)
{
licznik++;
if(licznik % 3 == 0)
c1.erase(Iter); // usuwanie elementu
}
-
- Sędziwy Jeż
- Posty: 61
- Rejestracja: 03 maja 2007, 21:14
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: KDE Plasma
- Architektura: x86
Re: [C++] STL i klasa list
a jaki blad wyskakuje ?
W javie wywalilby by w takiej sytuacji wyjatek ConcurrentModificationException.
Mozliwe ze tutaj masz podobnie - chodzi o to ze nie mozesz usuwac elementu na liscie w tym samym czasie co robisz po niej iteracje - konflikt bo ciezko iterowac po liscie elementow, ktora sie zmienia.
W javie wywalilby by w takiej sytuacji wyjatek ConcurrentModificationException.
Mozliwe ze tutaj masz podobnie - chodzi o to ze nie mozesz usuwac elementu na liscie w tym samym czasie co robisz po niej iteracje - konflikt bo ciezko iterowac po liscie elementow, ktora sie zmienia.
-
- Serdeczny Borsuk
- Posty: 109
- Rejestracja: 20 mar 2011, 19:08
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Lokalizacja: Warszawa
- Kontakt:
Re: [C++] STL i klasa list
Brakuje Ci typu iteratora.grigorij89 pisze:Ok dodałem taką pętelkęKod: Zaznacz cały
int licznik =0; for( Iter = c1.begin();Iter != c1.end();Iter++) { licznik++; if(licznik % 3 == 0) c1.erase(Iter); // usuwanie elementu }
Kod: Zaznacz cały
for (c1::iterator iter = c1.begin(); iter != c1.end(); iter++)
"Never argue with idiot. He will drag you down to his level and then beat with experience."
Nie udzielam pomocy poza forum.
Nie udzielam pomocy poza forum.
-
- Sędziwy Jeż
- Posty: 61
- Rejestracja: 03 maja 2007, 21:14
- Płeć: Mężczyzna
- Wersja Ubuntu: inny OS
- Środowisko graficzne: KDE Plasma
- Architektura: x86
Re: [C++] STL i klasa list
@BigFun
Deklaracje ma juz wyzej,
@grigorij89
Tak na przyszłość to nie powinno sie używać dużych litery do nazw zmiennych chyba ze to są jakies stałe, makra czy cos.
Deklaracje ma juz wyzej,
Kod: Zaznacz cały
list <int>::iterator Iter;
Tak na przyszłość to nie powinno sie używać dużych litery do nazw zmiennych chyba ze to są jakies stałe, makra czy cos.
Ostatnio zmieniony 20 mar 2011, 22:28 przez Dario84, łącznie zmieniany 1 raz.
-
- Serdeczny Borsuk
- Posty: 109
- Rejestracja: 20 mar 2011, 19:08
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Lokalizacja: Warszawa
- Kontakt:
Re: [C++] STL i klasa list
Faktycznie, nie zauważyłem. Rzadko spotykam się z konstrukcją for z iteratorem definiowanym przed pętlą
.
Usuwany jest element z iteratora, który jest dalej wykorzystywany w kodzie. Listy wspierają bardzo dobrze kasowanie elementów z listy, ale akurat iterator wskazujący na usunięty element przestaje być poprawny.
Taki kod:
Powinien pomóc

Usuwany jest element z iteratora, który jest dalej wykorzystywany w kodzie. Listy wspierają bardzo dobrze kasowanie elementów z listy, ale akurat iterator wskazujący na usunięty element przestaje być poprawny.
Taki kod:
Kod: Zaznacz cały
if(licznik % 3 == 0)
{
list <int>::iterator temp;
temp = Iter++;
c1.erase(Iter); // usuwanie elementu
Iter = temp;
}
"Never argue with idiot. He will drag you down to his level and then beat with experience."
Nie udzielam pomocy poza forum.
Nie udzielam pomocy poza forum.
- Struchu
- Serdeczny Borsuk
- Posty: 116
- Rejestracja: 23 mar 2008, 19:58
- Płeć: Mężczyzna
- Wersja Ubuntu: 11.04
- Środowisko graficzne: GNOME
- Architektura: x86
Re: [C++] STL i klasa list
Ja bym zrobił tak:
I na przyszłość polecam zaglądać do dokumentacji. Tam jest dokładnie opisane jak metoda erase działa (a przede wszystkim co zwraca).
Kod: Zaznacz cały
int licznik = 0;
list<int>::iterator iter = c1.begin();
while(iter != c1.end()) {
if(licznik % 3 == 2)
iter = c1.erase(iter);
else
iter++;
licznik++;
}
- grigorij89
- Piegowaty Guziec
- Posty: 5
- Rejestracja: 05 gru 2010, 22:33
- Płeć: Mężczyzna
- Wersja Ubuntu: 10.04
- Środowisko graficzne: GNOME
- Architektura: x86
- Kontakt:
Re: [C++] STL i klasa list
Dzięki wielkie wszystkim za pomoc , prosiłbym jeszcze o pomoc w opakowaniu tego mini algorytmu usuwania w wzorzec funkcji.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 21 gości