Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

16.8.2 Iteraattori

Esimerkissä taulukon tulostus on tehty iteraattorin avulla. Iteraattorin ideana on tarjota tietty, erittäin suppea joukko operaatiota, joita siihen voidaan kohdistaa. Näin samalla rajapinnalla varustettu iteraattori voidaan toteuttaa hyvin erilaisille tietorakenteille esimerkiksi taulukoille ja linkitetyille listoille. Iteraattorille esitettyjä suomennoksia ovat esimerkiksi selain ja vipellin. Huomattakoon että esimerkiksi C-taulukon osoitin toteuttaa iteraattorin rajapinnan.

Vektorin tapauksessa tietorakenne voitaisiin käydä läpi myös taulukkomaisesti,

	  for (unsigned i=0; i<luvut.size();i++)
	    os << setw(5) << luvut[i];

mutta tällöin tietorakenteen vaihtaminen esimerkiksi linkitetyksi listaksi vaatisi muutoksia tulosta-aliohjelmaan. Eli aina kun mahdollista, kannattaa välttää käyttämästä sitä tietoa, mikä tietorakenne on käytössä. Tietyssä mielessä iteraattorin ideaa toteuttaa kerhon jäsenen harrastusten tulostaminen:

	void cNaytto::tulosta(ostream &os,const cJasen &jasen)
	{
	  const cHarrastus *har;
	  int nro = jasen.Tunnus_nro();
	  jasen.tulosta(os);
	  har = kerho->eka_harrastus(nro);
	  while ( har ) {
	    har->tulosta(os);
	    har = kerho->seuraava_harrastus(nro);
	  }
	}

Harrastusten tulostamisessa on vain se vika, että tieto viimeksi käytetystä harrastuksesta on cHarrastus-luokassa vain yhtenä esiintymänä. Näin jos samaa kerhoa käyttäisi useampi näyttö yhtäaikaa, niin tulostus menisi sekaisin.

Oikeassa iteraattorissa tieto siitä, millä kohdalla ollaan ja mihin voidaan siirtyä seuraavaksi, asuu itse iteraattorioliossa. Iteraattorikin voi muuttua epäkelvoksi, jos tietorakenteeseen tehdään muutoksia iteroinnin alkamisen jälkeen.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys