Page 1 of 1

[IP] for- en while-lus & iterators

Posted: Fri Nov 30, 2012 9:09 pm
by Flipper
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) :?

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

Posted: Fri Nov 30, 2012 9:39 pm
by Robbe
Laat mij uw vraag met een vraag beantwoorden: wat is het verschil tussen een for-lus en een while-lus?

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

Posted: Fri Nov 30, 2012 11:07 pm
by djgl3nn
Ge doet geen it++ bij de while.

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

Posted: Fri Nov 30, 2012 11:58 pm
by Glenn
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.

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

Posted: Sat Dec 01, 2012 1:14 am
by Flipper
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:

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

Posted: Sat Dec 01, 2012 1:33 am
by djgl3nn
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.

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

Posted: Sat Dec 01, 2012 1:44 pm
by BFC
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:

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

Posted: Sun Dec 02, 2012 1:46 am
by Glenn
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. :)

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

Posted: Mon Dec 03, 2012 12:24 am
by djgl3nn
Hmm ik heb wel graag antwoorden die kort zeggen wat er fout is, en ik denk dat hij direct doorhad waarom het fout was.

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

Posted: Mon Dec 03, 2012 12:48 am
by BFC
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

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

Posted: Tue Dec 04, 2012 2:23 pm
by Robbe
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