[IP] for- en while-lus & iterators

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

User avatar
Flipper
Posts: 193

[IP] for- en while-lus & iterators

Post#1 » Fri Nov 30, 2012 9:09 pm

Gegeven een lijst l en de ondestaande lussen (in C++):

while-lus

Code: Select all


list<int>::iterator it = l.begin()     // start bij het begin
while( it != l.end() ) { // drukt af zolang de iterator het einde niet bereikt heeft
cout << *it << " ";
}
for-lus

Code: Select all

    
list<int>::iterator it = l.begin(); // start bij het begin
for (it = l.begin(); it != l.end(); it++) { // drukt af zolang het einde niet bereikt is
cout << *it << " ";
}
Waarom doet de for-lus netjes wat ik ervan verwacht (de lijst afdrukken tot en met het einde), maar blijft de while-loop oneindig lang afdrukken? (die drukt herhaaldelijk de lijst af) :?
They call him Flipper, Flipper, faster than lightning,
No-one you see, is smarter than he,
And we know Flipper, lives in a world full of wonder,
Flying there-under, under the sea!

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: [IP] for- en while-lus & iterators

Post#2 » Fri Nov 30, 2012 9:39 pm

Laat mij uw vraag met een vraag beantwoorden: wat is het verschil tussen een for-lus en een while-lus?
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
djgl3nn
WOZ
Posts: 1938

Re: [IP] for- en while-lus & iterators

Post#3 » Fri Nov 30, 2012 11:07 pm

Ge doet geen it++ bij de while.
WINAK Schacht 2009-2010
WINAK Sport 2010-2011
WINAK Mentor Informatica 2011-2012
WINAK Ouwe Zak 2012-...

UA Sportraad Webmaster 2012-...

Glenn
Posts: 280

Re: [IP] for- en while-lus & iterators

Post#4 » Fri Nov 30, 2012 11:58 pm

Hoi,

Je was inderdaad vergeten om it++ te schrijven of het einde van je while lus. Je code zou als volgt wel werken.

Code: Select all


list<int>::iterator it = l.begin()     // start bij het begin
while( it != l.end() ) { // drukt af zolang de iterator het einde niet bereikt heeft
cout << *it << " ";
it++;
}
Je moet die it++; schrijven omdat dit commando er voor zorgt dat je pointer wijst naar het volgende element in de lijst. Als je niet gaat wijzen naar het volgende element in de lijst, dan blijf je heel de tijd op dezelfde plek in de lijst hangen, en geraak je nooit uit de while loop. Je kan pas uit je while loop geraken, als je door heel de lijst gewandeld hebt. :)

Je regel while ( it != l.end() ) { ... } wil eigenlijk zeggen in mensentaal "doe het volgende, en blijf het maar tot in het oneindige herhalen zolang dat je pointer niet wijst naar het past-the-end element in de lijst. Dat past-the-end-element kan je bekijken als een soort van extra element dat helemaal achteraan in de lijst zit als aller aller aller laatste element (jij hebt het element er niet ingestopt) en dat enkel maar dient om de lijst te laten merken dat hij op het einde zit :). Dus stel je hebt een lijst met daarin de getallen 1,5,7,9.

Dat zal *it eerst zijn: 1 (*it betekent letterlijk, waar it naar wijst)
Daarna zal *it zijn: 5 (*it betekent letterlijk, waar it naar wijst)
Daarna zal *it zijn: 7 (*it betekent letterlijk, waar it naar wijst)
Daarna zal *it zijn: 9 (*it betekent letterlijk, waar it naar wijst)
Daarna zal *it zijn: past-the-end-element

l.end() returned eigenlijk gewoon het past-the-end-element. Hij blijft dus in de while-lus zo lang dat it niet gelijk is aan het past the end element. Natuurlijk mag je niet vergeten om telkens je pointer naar het volgende element te laten wijzen, en dat doe je via it++ :).

Hoe het komt dat it++ ervoor zorgt dat je pointer it zal wijzen naar het volgende element in de lijst, hoef je voorlopig nog niet te weten denk ik. Dat heeft te maken met pointer arithmetic, maar zal je later wel begrijpen. :)

PS: eender welk commando dat je uitvoert (een element toevoegen, verwijderen, ...), de gegevensstructuur zorgt er steeds voor dat het past-the-end element steeds als het ware op het einde van de lijst blijft zitten.

User avatar
Flipper
Posts: 193

Re: [IP] for- en while-lus & iterators

Post#5 » Sat Dec 01, 2012 1:14 am

djgl3nn wrote:Ge doet geen it++ bij de while.
nvm, ik had de code half-en-half gekopieerd uit het voorbeeld dat de praktijkassistent C++ me gaf:

Code: Select all


int main ( int argc , char * argv [])
{
list < int > l ;
for ( int i = 1; i <= 5; i ++) l.push_back ( i );
list < int >:: iterator it = l.begin ();

cout << " l contains : " ;
while ( it != it . end ()) {
cout << " " << * it ;
}
cout << endl ;
cout << " l contains : " ;
for ( it = l.begin (); it != l.end (); it ++) {
cout << " " << * it ;
}
cout << endl ;
}
Die deed daar ook geen it++ bij die while lus. (en ik zie daar ook een syntactische fout bij die eerste lus).

OK, notie aan mezelf, nooit half klakkeloos iets overnemen, dat zou ik als wetenschapper beter moeten weten (maar die begon dan ook voor het eerst over containers, die dingen moet ik toch eerst snappen door een voorbeeld te copy-pasten). Aan de andere kant mag ik toch wel veronderstellen dat de praktijkassistenten toch eerst de moeite doen om eerst hun voorbeelden te checken of dat werkt alvorens ze te tonen. Je houdt je echt niet voor mogelijk hoe onzorgvuldig ze zijn. (en dan heb ik het niet specifiek over CPP, maar ook de andere vakken in het algemeen) :facepalm:
They call him Flipper, Flipper, faster than lightning,
No-one you see, is smarter than he,
And we know Flipper, lives in a world full of wonder,
Flying there-under, under the sea!

User avatar
djgl3nn
WOZ
Posts: 1938

Re: [IP] for- en while-lus & iterators

Post#6 » Sat Dec 01, 2012 1:33 am

Assistent zijn is best nog wel veel werk denk ik, en zo'n kleine foutjes gaat ge altijd tegenkomen.
Het internet had u genoeg juiste voorbeelden kunnen geven trouwens, iets intypen in google is meestal minder werk als de slides uitpluizen.
WINAK Schacht 2009-2010
WINAK Sport 2010-2011
WINAK Mentor Informatica 2011-2012
WINAK Ouwe Zak 2012-...

UA Sportraad Webmaster 2012-...

User avatar
BFC
WOZ
Posts: 719

Re: [IP] for- en while-lus & iterators

Post#7 » Sat Dec 01, 2012 1:44 pm

Kvraag me echt af hoe sommige mensen erin slagen om een antwoord te geven van 3 bladzijden, wanneer ze het duidelijk kunnen uitleggen in 2 regels :facepalm:
I'm not random, you just can't think as fast as me

Glenn
Posts: 280

Re: [IP] for- en while-lus & iterators

Post#8 » Sun Dec 02, 2012 1:46 am

Flipper wrote: OK, notie aan mezelf, nooit half klakkeloos iets overnemen, dat zou ik als wetenschapper beter moeten weten (maar die begon dan ook voor het eerst over containers, die dingen moet ik toch eerst snappen door een voorbeeld te copy-pasten). Aan de andere kant mag ik toch wel veronderstellen dat de praktijkassistenten toch eerst de moeite doen om eerst hun voorbeelden te checken of dat werkt alvorens ze te tonen. Je houdt je echt niet voor mogelijk hoe onzorgvuldig ze zijn. (en dan heb ik het niet specifiek over CPP, maar ook de andere vakken in het algemeen)
Ja, ik begrijp je wel ze. Het is natuurlijk ook wel zo dat die assistenten het echt wel razend druk hebben met hun onderzoek. Maar voor de eerstejaars hadden ze misschien wel wat zorgvuldiger mogen zijn. :)
BFC wrote:Kvraag me echt af hoe sommige mensen erin slagen om een antwoord te geven van 3 bladzijden, wanneer ze het duidelijk kunnen uitleggen in 2 regels :facepalm:
Om volledig te zijn :). Voor iemand uit het eerste jaar zijn dingen die voor ons vanzelfsprekend zijn misschien nog niet vanzelfsprekend. Daarnaast wou ik ook al even schetsen wat er dieper achter die iterators zit. Ik heb liever een antwoord dat iets te uitgebreid is, dan een antwoord waar ik nog op mijn honger mee zit. :P

Ik had ook gewoon kunnen zeggen: omdat je it++ nog op het einde van de while-lus moet schrijven, omdat je anders niet verdergaat in je lijst. Maar dat antwoord vind ik ook wel wat kort door de bocht. Voor Flipper is het waarschijnlijk nog een raadsel wat die iterators zijn (zijn het C++ keywords, kan je het ook verklaren in termen van andere dingen, ...). Met mijn antwoord wou ik al een tipje van sluier oplichten. :)

User avatar
djgl3nn
WOZ
Posts: 1938

Re: [IP] for- en while-lus & iterators

Post#9 » Mon Dec 03, 2012 12:24 am

Hmm ik heb wel graag antwoorden die kort zeggen wat er fout is, en ik denk dat hij direct doorhad waarom het fout was.
WINAK Schacht 2009-2010
WINAK Sport 2010-2011
WINAK Mentor Informatica 2011-2012
WINAK Ouwe Zak 2012-...

UA Sportraad Webmaster 2012-...

User avatar
BFC
WOZ
Posts: 719

Re: [IP] for- en while-lus & iterators

Post#10 » Mon Dec 03, 2012 12:48 am

djgl3nn wrote:Hmm ik heb wel graag antwoorden die kort zeggen wat er fout is, en ik denk dat hij direct doorhad waarom het fout was.
this
I'm not random, you just can't think as fast as me

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: [IP] for- en while-lus & iterators

Post#11 » Tue Dec 04, 2012 2:23 pm

djgl3nn wrote:Hmm ik heb wel graag antwoorden die kort zeggen wat er fout is, en ik denk dat hij direct doorhad waarom het fout was.
Voor niet-triviale zaken, ja. Voor triviale dingen die je later nog veel gaat nodig hebben (zoals dit) geef je volgens mij best NIET direct het antwoord. But then again, that's my way of helping: asking questions :P
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 8 guests

cron