C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Gültigkeit von Iteratoren

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Brueckner
Guest





PostPosted: Wed Sep 29, 2004 10:36 pm    Post subject: Gültigkeit von Iteratoren Reply with quote



Hallo,

ich habe gerade ein kleines Verständnisproblem. Gegeben sei folgendes
Code-Schnipsel:

std::list<Object> l;

for (std::list<Object>::iterator i=l.begin(); i!=l.end(); ++i)
{
try
{
i->someMagicalOperationThatMightThrowAnException();
}
catch (std::exception &e)
{
l.erase(i);
};
};

Wenn diese Exception zuschlägt und ich daher das Element aus der Liste
entferne, ist dann i noch gültig, so daß der nächste Schleifendurchlauf
korrekt gemacht werden kann oder wird i ungültig und ich kann mich auf
nichts mehr verlassen? Und was wäre die passende Begründung für die
Antwort (vorzugsweise eine Stelle aus dem Stroustrup, da ich [noch]
keinen Standard besitze).

Danke schonmal
Markus
--
Unter Fernwartung versteht man bei MS vermutlich fernschaltbare
Steckdosen ... natuerlich per
Keypress-over-Hausmeister-over-Voice-over-Phone Protokoll.
- Alexander Schreiber in dcsm

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Wed Sep 29, 2004 11:24 pm    Post subject: Re: Gültigkeit von Iteratoren Reply with quote



"Markus Brueckner" <news (AT) slash-me (DOT) net> schrieb:

Quote:
std::list<Object> l;

for (std::list<Object>::iterator i=l.begin(); i!=l.end(); ++i)
{
try
{
i->someMagicalOperationThatMightThrowAnException();
}
catch (std::exception &e)
{
l.erase(i);
};
};

Wenn diese Exception zuschlägt und ich daher das Element aus der Liste
entferne, ist dann i noch gültig

Wohl kaum.

Quote:
nichts mehr verlassen? Und was wäre die passende Begründung für die
Antwort

"Logisches" Denken.

Quote:
(vorzugsweise eine Stelle aus dem Stroustrup, da ich [noch]
keinen Standard besitze).

Bei Wiley gibt's einen als Buch mit integriertem TC-1, ca. 50 EUR.

MfG

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Brueckner
Guest





PostPosted: Thu Sep 30, 2004 8:24 am    Post subject: Re: Gültigkeit von Iteratoren Reply with quote



"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> writes:

Quote:
Wenn diese Exception zuschlägt und ich daher das Element aus der Liste
entferne, ist dann i noch gültig

Wohl kaum.

Das war zu erwarten. Aber wie implementiere ich das dann? Das Ziel ist,
daß mit den Ergebnissen der Operation so lange gearbeitet wird, bis was
schiefgeht. Wenn die Exception fliegt, dann nehme ich an, daß das
ELement kaputt ist und entferne es aus der Liste. Nur wie implementiere
ich das? Irgendwie fehlt mir hier grad was.


Quote:
Bei Wiley gibt's einen als Buch mit integriertem TC-1, ca. 50 EUR.

Ah, danke.

Markus
--
Das Universum expandiert, aber ich
krieg immer seltener nen Parkplatz!
- Zitat aus space night

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Pesti
Guest





PostPosted: Thu Sep 30, 2004 11:40 am    Post subject: Re: G374ltigkeit von It... ^ Reply with quote

Markus Brueckner <news (AT) slash-me (DOT) net> wrote:

Quote:
"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> writes:

Wenn diese Exception zuschlägt und ich daher das Element aus der
Liste
entferne, ist dann i noch gültig

Wohl kaum.

Das war zu erwarten. Aber wie implementiere ich das dann? Das Ziel ist,
daß mit den Ergebnissen der Operation so lange gearbeitet wird, bis was
schiefgeht. Wenn die Exception fliegt, dann nehme ich an, daß das
ELement kaputt ist und entferne es aus der Liste. Nur wie implementiere
ich das? Irgendwie fehlt mir hier grad was.


Bei Wiley gibt's einen als Buch mit integriertem TC-1, ca. 50 EUR.

Ah, danke.

Markus

Ungetestet:

std::list<Object> l;

for (std::list<Object>::iterator i=l.begin(); i!=l.end()Wink
{
try
{
i->someMagicalOperationThatMightThrowAnException();
++i;
}
catch (std::exception &e)
{
l.erase(i++);
};
};

Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
dietmar_kuehl@yahoo.com
Guest





PostPosted: Thu Sep 30, 2004 11:42 am    Post subject: Re: Gültigkeit von Iteratoren Reply with quote

Markus Brueckner wrote:
Quote:
Nur wie implementiere ich das?

std::list<Object> l;
for (std::list<Object>::iterator it = l.begin(), end = l.end();
it != end; )
{
try
{
it->someMagicalOperationThatMightThrowAnException();
++it;
}
catch (...)
{
it = l.erase(it);
}
}
--

<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Thu Sep 30, 2004 12:03 pm    Post subject: Re: Gültigkeit von Iteratoren Reply with quote

Markus Brueckner wrote:
Quote:

"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> writes:

Wenn diese Exception zuschlägt und ich daher das Element aus der Liste
entferne, ist dann i noch gültig

Wohl kaum.

Das war zu erwarten. Aber wie implementiere ich das dann? Das Ziel ist,
daß mit den Ergebnissen der Operation so lange gearbeitet wird, bis was
schiefgeht. Wenn die Exception fliegt, dann nehme ich an, daß das
ELement kaputt ist und entferne es aus der Liste. Nur wie implementiere
ich das? Irgendwie fehlt mir hier grad was.


Was dir fehlt, ist das kleine Detail:
erase liefert dir den Iterator zum naechsten Element hinter dem
geloeschten.
Alles andere ergibt sich dann daraus. (Siehe meine andere Antwort)

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Brueckner
Guest





PostPosted: Thu Sep 30, 2004 8:10 pm    Post subject: Re: Gültigkeit von Iteratoren Reply with quote

Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> writes:

Quote:
Was dir fehlt, ist das kleine Detail:
erase liefert dir den Iterator zum naechsten Element hinter dem
geloeschten.
Alles andere ergibt sich dann daraus. (Siehe meine andere Antwort)

Danke, dieses kleine Detail war es in der Tat. Danke auch an alle
anderen, die das geschrieben haben.

Markus
--
Quote:
Als User unter Linux bist Du ein Nix. D.h. der einzige der am System
rumschrauben darf ist root.
Ha! Jetzt weiss ich, warum der Name UNIX gaaaaanz frueher gewaehlt

wurde: You (are) nix => UNIX *g* - Michael Raab & Hauke Zuehl in dcoulm

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Friedhelm Hoerner
Guest





PostPosted: Fri Oct 01, 2004 10:09 am    Post subject: Re: Gültigkeit von Iteratoren Reply with quote

"dietmar_kuehl (AT) yahoo (DOT) com" <dietmar_kuehl (AT) yahoo (DOT) com> wrote

Quote:
Markus Brueckner wrote:
Nur wie implementiere ich das?

| std::list<Object> l;
| for (std::list<Object>::iterator it = l.begin(), end = l.end();
| it != end; )
| {
| try
| {
| it->someMagicalOperationThatMightThrowAnException();
| ++it;
| }
| catch (...)
| {
| it = l.erase(it);
| }
| }
--

Da bin ich auch schonmal hereingefallen...
Spätestens wenn der Containertyp geändert wird (bei mir war's ein
vector in VC7), ändet sich eventuell mit dem erase() auch l.end() und
dann tritt it != end nicht (oder zu spät) ein.

Deshalb entweder

for (std::list<Object>::iterator it = l.begin(); it != l.end(); )

oder

{
it = l.erase(it);
end = l.end();
}

wenn die exception selten und l.end() teuer ist.

Gruss Friedhelm.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.