 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Brueckner Guest
|
Posted: Wed Sep 29, 2004 10:36 pm Post subject: Gültigkeit von Iteratoren |
|
|
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
|
Posted: Wed Sep 29, 2004 11:24 pm Post subject: Re: Gültigkeit von Iteratoren |
|
|
"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
|
Posted: Thu Sep 30, 2004 8:24 am Post subject: Re: Gültigkeit von Iteratoren |
|
|
"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
|
Posted: Thu Sep 30, 2004 11:40 am Post subject: Re: G374ltigkeit von It... ^ |
|
|
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()
{
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
|
Posted: Thu Sep 30, 2004 11:42 am Post subject: Re: Gültigkeit von Iteratoren |
|
|
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
|
Posted: Thu Sep 30, 2004 12:03 pm Post subject: Re: Gültigkeit von Iteratoren |
|
|
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
|
Posted: Thu Sep 30, 2004 8:10 pm Post subject: Re: Gültigkeit von Iteratoren |
|
|
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
|
Posted: Fri Oct 01, 2004 10:09 am Post subject: Re: Gültigkeit von Iteratoren |
|
|
"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 |
|
 |
|
|
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
|
|