[C++] STL i klasa list

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
grigorij89
Piegowaty Guziec
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

Post autor: grigorij89 »

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
Awatar użytkownika
Struchu
Serdeczny Borsuk
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

Post autor: Struchu »

Niekoniecznie: poczytaj o metodzie erase i o iteratorach. Plus do tego prosty warunek:

Kod: Zaznacz cały

if(i % 3 == 0)

i cały program gotowy ;)
Ma zielone, kocie oczy...
Awatar użytkownika
grigorij89
Piegowaty Guziec
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

Post autor: grigorij89 »

Ok dzięki za info. Mam jednak właśnie problem z dostępem do co 3 elementu ,dajmy na to takie coś :

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;  
  
}
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 :(
Awatar użytkownika
Struchu
Serdeczny Borsuk
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

Post autor: Struchu »

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...
Awatar użytkownika
panjandrum
Sędziwy Jeż
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

Post autor: panjandrum »

A może lepszym wyborem jest tu wektor, zamiast listy. Będziesz miał wtedy bezpośredni dostęp do elementów.
Awatar użytkownika
grigorij89
Piegowaty Guziec
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

Post autor: grigorij89 »

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
   }
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ś??
Dario84
Sędziwy Jeż
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

Post autor: Dario84 »

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.
bigfun
Serdeczny Borsuk
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

Post autor: bigfun »

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
   }
Brakuje Ci typu iteratora.

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.
Dario84
Sędziwy Jeż
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

Post autor: Dario84 »

@BigFun
Deklaracje ma juz wyzej,

Kod: Zaznacz cały

 
   list <int>::iterator Iter;
@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.
Ostatnio zmieniony 20 mar 2011, 22:28 przez Dario84, łącznie zmieniany 1 raz.
bigfun
Serdeczny Borsuk
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

Post autor: bigfun »

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:

Kod: Zaznacz cały

     if(licznik % 3 == 0)
      {
   list <int>::iterator temp;
        temp = Iter++;

         c1.erase(Iter);   // usuwanie elementu
         Iter = temp;
      }
Powinien pomóc
"Never argue with idiot. He will drag you down to his level and then beat with experience."

Nie udzielam pomocy poza forum.
Awatar użytkownika
Struchu
Serdeczny Borsuk
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

Post autor: Struchu »

Ja bym zrobił tak:

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++;
}
I na przyszłość polecam zaglądać do dokumentacji. Tam jest dokładnie opisane jak metoda erase działa (a przede wszystkim co zwraca).
Awatar użytkownika
grigorij89
Piegowaty Guziec
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

Post autor: grigorij89 »

Dzięki wielkie wszystkim za pomoc , prosiłbym jeszcze o pomoc w opakowaniu tego mini algorytmu usuwania w wzorzec funkcji.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 21 gości