[ zlatko84 @ 28.10.2009. 13:56 ] @
Malo mi je nejasan pojam interatora u c++ pa bi molio za objasnjenja i neke jednostavne primjere ili jos bolje ako neko moze da rijesio ovaj zadatak pa da to bude kao primjer. Zadatak glasi ovako: Napisati klasu Linije, koja omogucava da prolazimo kroz string liniju po liniju. U tu svrhu, konstruktor kalse Linije treba da prima jedan argument tipa string. Klasa takodje treba da ima ugnjezdenu klasu interator, koja podrzava operatore inkrementiranja, dereferenciranja i poredjenja. Konačno, klasi Linije treba dodati metode begin() i end() sa uobičajnom semantikom.
[ Mihajlo Cvetanović @ 28.10.2009. 14:31 ] @
Pojam iteratora je uveden u C++ STL (Standard Template Library). Svaki kontejner (std::list, std::vector, std::map) u STL-u ima svoj iterator. Svi iteratori svih kontejnera se koriste na identičan način. To olakšava ovladavanje STL-om. Iteratori imaju ograničen skup aktivnosti koje s njima mogu da se rade. To sprečava programera da negde zabrlja. Najjednostavnija stvar je iteracija kroz ceo kontejner, i ovaj kod je istovetan, šta god da staviš umesto KONTEJNER:

Code:

void iteriraj(KONTEJNER& cinculatori)
{
  for (KONTEJNER::iterator it = cinculatori.begin(); it != cinculatori.end(); it++)
  {
    // Uradi nešto sa it*, recimo (it*).cinculiraj()
  }
}


Da bi ovo radilo ovaj KONTEJNER::iterator mora da može da dobije vrednost (operator = i kopi konstruktor), da se poredi sa drugim iteratorom (== i !=), da se inkrementira (it++ i ++it), i da se dereferencira (it*). To su sve operatori koje ti moraš da napišeš. Takođe, sama klasa KONTEJNER mora da ima dve funkcije, begin() koja vraća iterator na prvog člana, i end() koji vraća ono što je posle poslednjeg člana (tako da važi poslednji_član++ == end()). Ti (kreator klase KONTEJNER) sam odlučuješ šta je kod tebe prvo i poslednje, ali šta god da odlučiš ovaj primer gore mora da ima smisla kad se izvršava.

Ja nikad nisam pravio klasu koja mora da oponaša STL logiku, ali pretpostavljam da je suština funkcionalnosti u operatoru ++. Tu mora da postoji kod koji će promeniti vrednost iteratoru tako da dobiješ novi string kad se taj iterator dereferencira (sa *).

Ovde je olakšavajuća okolnost što ne mora da se implementira i operator --.
[ zlatko84 @ 29.10.2009. 08:17 ] @
Malo mi je sad jasnije ali ne bas kristalno kako bi ja volio da bude... Imas li neki primjer u kome se kreces po listi i radis nesto bilo sta sa svim djelovima i operatorima ukljucujuci i onaj begin() i end()...
[ mmix @ 29.10.2009. 08:57 ] @
Izvinjavam se, samo sam preimenovao temu, ovo n mi para usi osima ko ja nisam pogresio i postoje interatori, onda vratite.
[ X Files @ 29.10.2009. 09:09 ] @
^
(OT)
Kako da ne, postoje i pnetlje ;)
[ zlatko84 @ 29.10.2009. 09:38 ] @
Ma ok je ja sam slucajno ubacio to n tako da nema problema i hvala...
[ Mihajlo Cvetanović @ 29.10.2009. 09:41 ] @
Citat:
zlatko84: Malo mi je sad jasnije ali ne bas kristalno kako bi ja volio da bude... Imas li neki primjer u kome se kreces po listi i radis nesto bilo sta sa svim djelovima i operatorima ukljucujuci i onaj begin() i end()...


Imaš na Guglu, traži "iterator begin end". Ima čak i na Vikipediji http://en.wikipedia.org/wiki/Iterator#C.2B.2B
[ azolex @ 18.11.2009. 21:17 ] @
Ovako, mozda moras da ukapiras Vectore, Mape i Setove prvo. Definisacemo vektor :
Code:

#include <vector>

std::Vector<int> NekiVektor; // std nije bas potreban

//Nakon toga u nekoj klasi "NekaKlasa" cemo napraviti funkcije za manipulciju vektora, takodje deklarisacemo taj vektor unutar clase:
Public Class NekaKlasa 
{
NekiVektor mNekiVektor; // oznacili smo ga

public void DodajElement( int pElement )  
{
      mNekiVektor.push_back( pElement ); // dodaj mo ga, mozemo dodati i provere dali je element vec unutra
};     

public bool ImaLiElementaElement( int pElement ) // proverimo dali ima element, ovde cu objasniti iterator
{
       for (vector<int>::iterator it = mNekiVektor.begin(); it != mNekiVektor.end(); it++)
      {
              if ( (it*) == pElement )
                      return true;
      }
      return false;
};
// u prethodnom codu:
// Dodao sam element x tipa integer, nakon toga zelim da ga selektujem, pregledavam svaki element vektora mNekiVektor dok nenadjem element koji je jednak trazenoj vrednost
// Unutar te funkcije svaki element je van vektora oznacen kao "Iterator" tipa int
};


Nadam se da ti je ovo pomoglo, ja sam los objasnjavac :)
[ azolex @ 18.11.2009. 21:21 ] @
A da, nisam rekao .begin() i .end() je funkcija koja prolazi kroz ceo vektor(u ovom slucaju) odnosno neki "skup" posto za razliku od skupova svaki member nema dodeljenu brojcanu poziciju primer mArray[1] vektori se "storuju" odnosno redjaju po drugacijem redu odnosno vektorskom( mape i setovi takodje drugacije ) tako da .begin() i .end() samo jednostavno pretrazuju vektor.

EDIT1: A da nisam dodao odabrani iterator koji je deklarovan kao odredjeni tip primer int se ponasa kao obican "pointer" tako da sve sto mozes sa normalno odredjenim "pointerom" mozes i sa njim.

Koristim engleske izraze posto prvi put na srpskom pricam nesto vezano za programiranje :)