/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Iterator, Acccelerated C++
Fra : Torben W. Hansen


Dato : 14-02-06 13:46

Hej,

Jeg er igang med accelerated C++, hvor der på side 94 er et eksempel som
følgende:

//
for (vector<string>::const_iterator it = bottom.begin();
it != bottom.end(); ++it)
ret.push_back(*it);
//

Jeg kan ikke helt gennemskue hvad en iterator er, men jeg har en ide om, at
det må være noget med en pointer til et objekt ( string - i dette eksempel),
da man bla. bruger pointer dereferenceoperatoren (*) eller (->) notation.

Er jeg helt galt på den ?


Med venlig hilsen
Torben W. Hansen



 
 
Mogens Hansen (14-02-2006)
Kommentar
Fra : Mogens Hansen


Dato : 14-02-06 16:13


"Torben W. Hansen" <nospam@ins.com> wrote in message
news:43f1d0ea$0$47016$edfadb0f@dread15.news.tele.dk...
> Hej,
>
> Jeg er igang med accelerated C++,

Godt

[8<8<8<]
> Jeg kan ikke helt gennemskue hvad en iterator er, men jeg har en ide om,
> at
> det må være noget med en pointer til et objekt ( string - i dette
> eksempel),
> da man bla. bruger pointer dereferenceoperatoren (*) eller (->) notation.

Ja noget i den stil: iterator er en generalisering af pointer.
En pointer til et element i et build-in array er en iterator, men en
iterator er ikke nødvendigvis en pointer.

Læs eventuelt kapitel 5.2 en gang mere

Venlig hilsen

Mogens Hansen



Torben W. Hansen (14-02-2006)
Kommentar
Fra : Torben W. Hansen


Dato : 14-02-06 18:07

"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:43f1f379$0$67259$157c6196@dreader2.cybercity.dk...

Tak for svaret

> Læs eventuelt kapitel 5.2 en gang mere
Det har jeg gjort, men synes ikke rigtig at jeg bliver klogere...


> men en iterator er ikke nødvendigvis en pointer.
Det er jeg så ikke rigtig med på. Mener du de fire punkter på side 80 ?


//citat
An iterator is a value that
* Identifies a container and an element in the container
* Lets us examine the value stored in that element
* Provides operations for moving between elements in the container
* Restricts the available operations in ways that correspond to what the
container can handle efficiently
//citat slut



I appendix B.2.5, side 317, fandt jeg yderligere beskrivelse - det ku' være
at jeg lige skulle læse dette afsnit.

Med venlig hilsen
Torben W. Hansen



Igor V. Rafienko (14-02-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 14-02-06 18:37

[ Torben W. Hansen ]

[ ... ]

> > men en iterator er ikke nødvendigvis en pointer.
>
> Det er jeg så ikke rigtig med på. (...)


En iterator er en abstraksjon. En abstraksjon som lar en jobbe med
elementer i en samling (container), ett av gangen.

Kanskje det vil hjelpe med en analogi: tenk at du står foran en
kjøpmann og skal ha noen epler fra en kasse. Du peker med fingeren på
det eplet du skal ha. Fingeren din vil i så fall være en
(random-access) iterator. Kassen med epler vil være den underliggende
container (eller er det kanskje kassen + kjøpmann?)

En peker vil tilfredstille iteratorkrav for visse datastrukturer (fx.
en array). Men andre datastrukturer vil kreve litt mer kompliserte
implementasjoner av iterators. En iterator vil da typisk være en
klasse med noen tilstandsvariable (som fx. forteller hvor i den
underliggende datastrukturen iteratoren er) og noen metoder (slik som
op++() og op++(int)) som implementerer iteratorprotokollen.

[ ... ]





ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Torben W. Hansen (14-02-2006)
Kommentar
Fra : Torben W. Hansen


Dato : 14-02-06 19:14


"Igor V. Rafienko" <igorr@ifi.uio.no> skrev i en meddelelse
news:xjvk6bxrge2.fsf@fire.ifi.uio.no...
>[ Torben W. Hansen ]

> En iterator er en abstraksjon. En abstraksjon som lar en jobbe med
> elementer i en samling (container), ett av gangen.
>
> Kanskje det vil hjelpe med en analogi: tenk at du står foran en
> kjøpmann og skal ha noen epler fra en kasse. Du peker med fingeren på
> det eplet du skal ha. Fingeren din vil i så fall være en
> (random-access) iterator. Kassen med epler vil være den underliggende
> container (eller er det kanskje kassen + kjøpmann?)
>
> En peker vil tilfredstille iteratorkrav for visse datastrukturer (fx.
> en array). Men andre datastrukturer vil kreve litt mer kompliserte
> implementasjoner av iterators. En iterator vil da typisk være en
> klasse med noen tilstandsvariable (som fx. forteller hvor i den
> underliggende datastrukturen iteratoren er) og noen metoder (slik som
> op++() og op++(int)) som implementerer iteratorprotokollen.

Tak

Kan man lidt populært sige at en iterator er en "ting" (evt. klasse) som:

har med en containers dataelementer at gøre

tilbyder bla. værktøjer til at få adgang til /tilføje/fjerne dataelementer i
containeren

tilbyder værktøjer til manipulering af dataelementer i containeren

(og ifølge Mogens Hansen, ikke nødvendigvis gør dette via en pointer)

???

Med venlig hilsen
Torben W. Hansen





Igor V. Rafienko (14-02-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 14-02-06 19:39

[ Torben W. Hansen ]

[ ... ]

> Kan man lidt populært sige at en iterator er en "ting" (evt. klasse)
> som:


[ sitat ]

Iterators are a generalization of pointers that allow a C++ program to
work with different data structures (containers) in a uniform manner.

[ /sitat ]

.... synes meg å være ganske beskrivende.


> tilbyder bla. værktøjer til at få adgang til /tilføje/fjerne
> dataelementer i containeren


Iteratorer støtter ikke direkte det å legge til eller fjerne
dataelementer fra en underliggende container. Det er heller
containeren sine egne operasjoner som potensielt kan bruke en iterator
for å fjerne det elementetet iteratoren "peker på" (evt. legge til et
nytt element i forhold til et element "pekt på" av en iterator).

std::vector får nye elementer via "push_back()". Ingen iteratorer er
med i push_back (iallfall utad). std::list kan fx. legge til (insert)
et element ift. en gitt iterator. std::list kan også fjerne (erase) et
element angitt av en iterator.

Men en iterator i seg selv støtter ingen legge til/fjerne operasjoner.


> tilbyder værktøjer til manipulering af dataelementer i containeren


Nettopp. Traversering og manipulering.

Hvis du ser på hvilke operasjoner en iterator skal støtte[*] (fx. i
standarden), er det typisk noe for å gjennomløpe elementene, få tak i
elementene, og å bli sammenlignet med andre iteratorer.


> (og ifølge Mogens Hansen, ikke nødvendigvis gør dette via en
> pointer)


Ikke bare ifølge Mogens Hansen.

[ ... ]





ivr
[*] C++ er langt i fra alene om å sette opp slike krav som en
eksplisitt iteratorprokoll. Tilsvarende krav finner man i fx. Python.
Og lager man en Python iterator i C, ser man med en gang forholdet
mellom den protokollen og iteratorkravene i STL. Dette er dog en
digresjon.
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Torben W. Hansen (14-02-2006)
Kommentar
Fra : Torben W. Hansen


Dato : 14-02-06 22:21


"Igor V. Rafienko" <igorr@ifi.uio.no> skrev i en meddelelse
news:xjv4q317pkh.fsf@fire.ifi.uio.no...

> Iterators are a generalization of pointers that allow a C++ program to
> work with different data structures (containers) in a uniform manner.

> Iteratorer støtter ikke direkte det å legge til eller fjerne
> dataelementer fra en underliggende container. Det er heller
> containeren sine egne operasjoner som potensielt kan bruke en iterator
> for å fjerne det elementetet iteratoren "peker på" (evt. legge til et
> nytt element i forhold til et element "pekt på" av en iterator).

> std::vector får nye elementer via "push_back()". Ingen iteratorer er
> med i push_back (iallfall utad). std::list kan fx. legge til (insert)
> et element ift. en gitt iterator. std::list kan også fjerne (erase) et
> element angitt av en iterator.
> Men en iterator i seg selv støtter ingen legge til/fjerne operasjoner.

> Hvis du ser på hvilke operasjoner en iterator skal støtte[*] (fx. i
> standarden), er det typisk noe for å gjennomløpe elementene, få tak i
> elementene, og å bli sammenlignet med andre iteratorer.

OK - Jeg tror at jeg har fået nogenlunde fat om det

Tak for hjælpen ...

Med venlig hilsen
Torben W. Hansen



Michael Weber (15-02-2006)
Kommentar
Fra : Michael Weber


Dato : 15-02-06 23:31


[klip]

[ sitat ]
>
> Iterators are a generalization of pointers that allow a C++ program to
> work with different data structures (containers) in a uniform manner.
>
> [ /sitat ]
>
> ... synes meg å være ganske beskrivende.

[/klip]

Synes det er ulogisk at tale om pointers i en generalisation.
Generalisation handler ikke om "hvordan", men om "hvad".

En Iterator i c++ er vel også bare en implementation af GOF´s
Iterator-pattern eller ?

Med venlig hilsen
Michael Weber



Igor V. Rafienko (16-02-2006)
Kommentar
Fra : Igor V. Rafienko


Dato : 16-02-06 02:37

[ Michael Weber ]

[ ... iterators are a generalization of pointers ]

> Synes det er ulogisk at tale om pointers i en generalisation.
> Generalisation handler ikke om "hvordan", men om "hvad".


Jeg ser ikke motsigelsen (ej heller generalization "definisjonen").


> En Iterator i c++ er vel også bare en implementation af GOF´s
> Iterator-pattern eller ?


Nei, ikke hvis jeg leser intensjonen til Iterator pattern riktig.

[ ... ]





ivr
--
"...but it's HDTV -- it's got a better resolution than the real world."
       -- Fry, "When aliens attack"

Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste