Thread View: be.comp.programming
3 messages
3 total messages
Started by Gunter Schelfhout
Fri, 17 Oct 2003 20:24
C++ iterators
Author: Gunter Schelfhout
Date: Fri, 17 Oct 2003 20:24
Date: Fri, 17 Oct 2003 20:24
22 lines
1658 bytes
1658 bytes
In het boek van Jossutis, The C++ Standard Library kom ik het volgend
voorbeeld tegen (ingekort):
...
vector<int> coll;
// wat in de vector steken
vector<int>::iterator pos;
...
for (pos = coll.begin(); pos < coll.end(); pos += 2) {
//print
}
Over de bovenstaande for-loop zegt hij:
"The expression += 2 might result in undefined behavior if it moves the
iterator beyond the end() of the collection."
Nu, ik zit dat hier te bekijken, maar ik zie het niet. Van zodra de iterator
voorbij het end() gaat, dan wordt dit toch opgevangen door het statement
'pos < coll.end()', of niet?
Of zou het typo zijn en bedoelt hij 'pos != coll.end()'?
--
Blood, sweat & tears
Re: C++ iterators
Author: MaG
Date: Fri, 17 Oct 2003 21:26
Date: Fri, 17 Oct 2003 21:26
47 lines
2692 bytes
2692 bytes
"Gunter Schelfhout" <nospam@please.com> schreef in bericht
news:0eYjb.84164$jN3.4351093@phobos.telenet-ops.be...
> In het boek van Jossutis, The C++ Standard Library kom ik het volgend
> voorbeeld tegen (ingekort):
> ...
> vector<int> coll;
> // wat in de vector steken
> vector<int>::iterator pos;
> ...
> for (pos = coll.begin(); pos < coll.end(); pos += 2) {
> //print
> }
>
> Over de bovenstaande for-loop zegt hij:
> "The expression += 2 might result in undefined behavior if it moves the
> iterator beyond the end() of the collection."
>
> Nu, ik zit dat hier te bekijken, maar ik zie het niet. Van zodra de
iterator
> voorbij het end() gaat, dan wordt dit toch opgevangen door het statement
> 'pos < coll.end()', of niet?
>
> Of zou het typo zijn en bedoelt hij 'pos != coll.end()'?
> --
> Blood, sweat & tears
>
1) eigenlijk hoor je geen bewerkingen uit te voeren op iterators, pos++ en
pos-- mag, de rest is gevaarlijk. (vergelijk het met pointer
bewerkingen)
2) de end memberfunktie wijst al 1 positie *na* het laatste item. Dus
wanneer pos naar het laatste item wijst is
pos < coll.end() nog steeds waar! En pos + 2 is dus helemaal undefined!
D.w.z. kan vanalles zijn.
Die undefined zou wel eens weer kleiner dan coll.end() kunnen zijn! Dus die
for loop stopt niet gegarandeerd.
Bovendien trekt die for loop zich niets aan van wat er tussen de haken
gebeurt. Het middelste statement zal niet verhinderen
dat het derde deel iets illegaal uitvoert. De check gebeurt nadien.
pos != coll.end() lijkt mij ook beter, maar lost bovenstaand probleem niet
op.
De compiler maakt dus (gelukkig) terecht een opmerking.
MaG
Re: C++ iterators
Author: Bert Peers
Date: Sat, 18 Oct 2003 01:16
Date: Sat, 18 Oct 2003 01:16
28 lines
2358 bytes
2358 bytes
MaG wrote:
> "Gunter Schelfhout" <nospam@please.com> schreef in bericht
>>for (pos = coll.begin(); pos < coll.end(); pos += 2) {
>> //print
>>"The expression += 2 might result in undefined behavior if it moves the
>>iterator beyond the end() of the collection."
>
> 1) eigenlijk hoor je geen bewerkingen uit te voeren op iterators, pos++ en
> pos-- mag, de rest is gevaarlijk. (vergelijk het met pointer
> bewerkingen)
Hm, dat valt nog wel mee hoor. Zolang de iterator uit een collectie
komt die random access iterators terug geeft (bv vector), is += 2
geen enkel probleem en perfect legaal.
Maar je hebt wel gelijk dat er een risico is op wrap-around;
"officieel" is het probleem dat die += 2 achter de schermen
hetzelfde _moet_ doen als 2 keer "++"; maar "++" is enkel geldig
als de iterator _voor_ de operatie nog dereferencable was.
Dus als coll.size daar toevallig oneven is, is het niet "might"
maar "will" result in undefined behavior :)
> 2) de end memberfunktie wijst al 1 positie *na* het laatste item. Dus
> wanneer pos naar het laatste item wijst is
> pos < coll.end() nog steeds waar! En pos + 2 is dus helemaal undefined!
Bert
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads