 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Peter Dunker Guest
|
Posted: Wed Dec 08, 2004 9:39 am Post subject: verhalten der vector klasse beim löschen |
|
|
hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
2. das letze element wird an die stelle kopiert wo gelöscht wurde (wäre
sehr effizient aber manchmal bei sortierter reihenfolge schlecht)
3. unbestimmt und implementierungsabhängig
Danke
Peter
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Wed Dec 08, 2004 12:43 pm Post subject: Re: verhalten der vector klasse beim l366schenn^ |
|
|
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im Newsbeitrag
news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
| Quote: | hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
|
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt ist. Wozu
braucht man den bei dieser Operation?
Daß das gelöscht Element mit Index i zuerst neu konstruiert wird mit dem
Element i + 1 (über den Kopierkonstruktor), und dann operator= zwischen
diesen beiden aufgerufen wird kann ja wohl kaum Sinn gewesen sein, oder?
Thomas
--
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 |
|
 |
Torsten Robitzki Guest
|
Posted: Wed Dec 08, 2004 12:47 pm Post subject: Re: verhalten der vector klasse beim löschen |
|
|
Peter Dunker wrote:
| Quote: | hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
2. das letze element wird an die stelle kopiert wo gelöscht wurde (wäre
sehr effizient aber manchmal bei sortierter reihenfolge schlecht)
3. unbestimmt und implementierungsabhängig
|
1.
Habe ich jetzt was gewonnen?
mfg Torsten
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Wed Dec 08, 2004 12:52 pm Post subject: Re: verhalten der vector klasse beim l366schenn^ |
|
|
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
| Quote: |
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im Newsbeitrag
news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt ist. Wozu
braucht man den bei dieser Operation?
Daß das gelöscht Element mit Index i zuerst neu konstruiert wird mit dem
Element i + 1 (über den Kopierkonstruktor), und dann operator= zwischen
diesen beiden aufgerufen wird kann ja wohl kaum Sinn gewesen sein, oder?
|
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4 wäre,
wo explicit gesagt wird, daß der Destruktor nur sooft aufgerufen wird, wie
Elemente gelöscht werden. Bei meiner Variante müßte der Destruktor aber ein
zweites Mal aufgerufen werden, nämlich für das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
Thomas
--
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 |
|
 |
Christoph Rabel Guest
|
Posted: Wed Dec 08, 2004 1:35 pm Post subject: Re: verhalten der vector klasse beim löschen |
|
|
Peter Dunker wrote:
| Quote: | hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
|
Ja.
mfg
Christoph
--
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 |
|
 |
Chris Theis Guest
|
Posted: Wed Dec 08, 2004 3:30 pm Post subject: Re: verhalten der vector klasse beim l366schenn^ |
|
|
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> wrote
| Quote: |
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im Newsbeitrag
news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt ist.
Wozu
braucht man den bei dieser Operation?
Daß das gelöscht Element mit Index i zuerst neu konstruiert wird mit dem
Element i + 1 (über den Kopierkonstruktor), und dann operator= zwischen
diesen beiden aufgerufen wird kann ja wohl kaum Sinn gewesen sein, oder?
|
Tut mir leid, aber wenn du Element i loeschen willst, warum sollte dann das
geloeschte Element mit dem Index i+1 neu konstruiert werden??? Das wuerde ja
folgendes bedeuten:
1.) Element i wird in i+1 neu konstruiert
2.) Element i wird gloescht
3.) Element i+1 (welches ja nun die Werte vom gloeschten Element
beinhaltet!!) wird auf i kopiert.
Nun haben wir zwar ein Element eliminiert, aber die Werte von i+1 verloren
und dies kann wohl nicht der Sinn der Aktion gewesen sein.
| Quote: | Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4
wäre,
wo explicit gesagt wird, daß der Destruktor nur sooft aufgerufen wird, wie
Elemente gelöscht werden. Bei meiner Variante müßte der Destruktor aber
ein
zweites Mal aufgerufen werden, nämlich für das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
|
Wenn du den Standard genau liest, dann wird der Assignment Op & der copy
ctor im Rahmen von moeglichen Exceptions erwaehnt. Der Standard schreibt den
Effekt und die Komplexitaet vor, jedoch nicht wie die eigentliche
Implementierung dieser Operation aussieht. Schau mal in die Header Files
deiner Standard Lib und dann wirst du sehen was dort genau passiert. Eine
moegliche und vernuenftige Implementierung wuerde z.B. folgendes machen:
1.) Die Elemente i+1 bis end() werden auf Position i und folgend kopiert.
2.) Loeschen des letzten nun ueberschuessigen Elements welches doppelt
vorliegt.
Wie laeuft nun die Kopieraktion ab:
Hier gibt´s die Moeglichkeit, dass entweder ein memmove() ausgefuehrt wird,
oder eine Schleife welche die Elemente z.B. ueber Assignment Op kopiert.
Dies wird in der Regel abhaengig von der Iteratorimplementierung gemacht.
Das Anlegen der Elementkopien kann ja entweder per assignment oder copy ctor
gemacht werden, wobei die reale Implementierung ist dem Standard ziemlich
egal ist.
mfG
Chris
--
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 |
|
 |
Rolf Magnus Guest
|
Posted: Wed Dec 08, 2004 7:48 pm Post subject: Re: verhalten der vector klasse beim löschen |
|
|
Chris Theis wrote:
| Quote: | 1. die daten dahinter werden komplett ein element nach vorne kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt ist.
Wozu
braucht man den bei dieser Operation?
Daß das gelöscht Element mit Index i zuerst neu konstruiert wird mit
dem Element i + 1 (über den Kopierkonstruktor), und dann operator=
zwischen diesen beiden aufgerufen wird kann ja wohl kaum Sinn gewesen
sein, oder?
Tut mir leid, aber wenn du Element i loeschen willst, warum sollte dann
das geloeschte Element mit dem Index i+1 neu konstruiert werden???
|
Nein. Umgekehrt wird ein Schuh draus. Wenn man das Element mit Index i
löscht, und das nicht das letzte Element war, gibt es nachher wieder ein
Element mit Index i, und zwar das, das vorher den Index i+1 hatte. Also
wird der Wert des Elements i+1 ins Element i kopiert, dann i+2 nach i+1,
u.s.w....
Ich glaube aucht, daß Thomas das gemeint hat.
| Quote: | Das
wuerde ja folgendes bedeuten:
1.) Element i wird in i+1 neu konstruiert
|
_aus_ i+1, nicht _in_
| Quote: | 2.) Element i wird gloescht
3.) Element i+1 (welches ja nun die Werte vom gloeschten Element
beinhaltet!!) wird auf i kopiert.
Nun haben wir zwar ein Element eliminiert, aber die Werte von i+1 verloren
und dies kann wohl nicht der Sinn der Aktion gewesen sein.
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4
wäre,
wo explicit gesagt wird, daß der Destruktor nur sooft aufgerufen wird,
wie Elemente gelöscht werden. Bei meiner Variante müßte der Destruktor
aber
ein
zweites Mal aufgerufen werden, nämlich für das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
Wenn du den Standard genau liest, dann wird der Assignment Op & der copy
ctor im Rahmen von moeglichen Exceptions erwaehnt. Der Standard schreibt
den Effekt und die Komplexitaet vor, jedoch nicht wie die eigentliche
Implementierung dieser Operation aussieht.
|
Wenn aber gesagt wird, daß nur genau ein Destruktor-Aufruf beim Löschen
erfolgt, kann kein Kopierkonstruktor beteiligt sein, da es für jeden
Konstruktoraufruf exakt ein Destruktoraufruf geben muß.
| Quote: | Schau mal in die Header Files deiner Standard Lib und dann wirst du sehen
was dort genau passiert. Eine moegliche und vernuenftige Implementierung
wuerde z.B. folgendes machen:
1.) Die Elemente i+1 bis end() werden auf Position i und folgend kopiert.
2.) Loeschen des letzten nun ueberschuessigen Elements welches doppelt
vorliegt.
Wie laeuft nun die Kopieraktion ab:
Hier gibt´s die Moeglichkeit, dass entweder ein memmove() ausgefuehrt
wird, oder eine Schleife welche die Elemente z.B. ueber Assignment Op
kopiert. Dies wird in der Regel abhaengig von der Iteratorimplementierung
gemacht. Das Anlegen der Elementkopien kann ja entweder per assignment
oder copy ctor gemacht werden, wobei die reale Implementierung ist dem
Standard ziemlich egal ist.
|
Nein, denn ein Copy-Kontruktor würde eine vorherige Zerstörung des Objekts
an der Zielposition erfordern, womit wir dann aber für jedes kopierte
Objekt einen zusätzlichen Destruktoraufruf hätten.
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Wed Dec 08, 2004 9:37 pm Post subject: Re: verhalten der vector klasse beim l366schenn^ |
|
|
"Chris Theis" <Chris.Theis (AT) nospam (DOT) cern.ch> schrieb im Newsbeitrag
news:cp76re$49r$1 (AT) sunnews (DOT) cern.ch...
| Quote: |
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> wrote in message
news:41b6f922$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im
Newsbeitrag
news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
hallo,
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt ist.
Wozu
braucht man den bei dieser Operation?
Daß das gelöscht Element mit Index i zuerst neu konstruiert wird mit
dem
Element i + 1 (über den Kopierkonstruktor), und dann operator=
zwischen
diesen beiden aufgerufen wird kann ja wohl kaum Sinn gewesen sein,
oder?
Tut mir leid, aber wenn du Element i loeschen willst, warum sollte dann
das
geloeschte Element mit dem Index i+1 neu konstruiert werden??? Das wuerde
ja
folgendes bedeuten:
1.) Element i wird in i+1 neu konstruiert
2.) Element i wird gloescht
3.) Element i+1 (welches ja nun die Werte vom gloeschten Element
beinhaltet!!) wird auf i kopiert.
Nun haben wir zwar ein Element eliminiert, aber die Werte von i+1 verloren
und dies kann wohl nicht der Sinn der Aktion gewesen sein.
|
Ich meinte Element i (auf das der iterator zeigt) destruieren, und dann den
Speicher mit dem Wert von Element i + 1 neu besetzen.
| Quote: |
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4
wäre,
wo explicit gesagt wird, daß der Destruktor nur sooft aufgerufen wird,
wie
Elemente gelöscht werden. Bei meiner Variante müßte der Destruktor aber
ein
zweites Mal aufgerufen werden, nämlich für das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
Wenn du den Standard genau liest, dann wird der Assignment Op & der copy
ctor im Rahmen von moeglichen Exceptions erwaehnt. Der Standard schreibt
den
Effekt und die Komplexitaet vor, jedoch nicht wie die eigentliche
Implementierung dieser Operation aussieht. Schau mal in die Header Files
deiner Standard Lib und dann wirst du sehen was dort genau passiert. Eine
moegliche und vernuenftige Implementierung wuerde z.B. folgendes machen:
1.) Die Elemente i+1 bis end() werden auf Position i und folgend kopiert.
2.) Loeschen des letzten nun ueberschuessigen Elements welches doppelt
vorliegt.
Wie laeuft nun die Kopieraktion ab:
Hier gibt´s die Moeglichkeit, dass entweder ein memmove() ausgefuehrt
wird,
oder eine Schleife welche die Elemente z.B. ueber Assignment Op kopiert.
Dies wird in der Regel abhaengig von der Iteratorimplementierung gemacht.
Das Anlegen der Elementkopien kann ja entweder per assignment oder copy
ctor
gemacht werden, wobei die reale Implementierung ist dem Standard ziemlich
egal ist.
|
Geht nicht über den Kopierkonstruktor. Da müßte vorher das jeweilige Element
zerstört werden, auf dessen Platz dann mittels des Kopierkonstruktors das
neue Element konstruiert wird. Nur dummerweise müßt man dann den Destruktor
für jedes zu verschiebende Element aufrufen, was nicht erlaubt ist.
Außerdem muß der operator= sooft aufgerufen werden, wie Elemente hinter dem
zu löschenden iterator liegen.
Thomas
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Dec 09, 2004 1:51 pm Post subject: Re: verhalten der vector klasse beim löschen |
|
|
Thomas Mang wrote:
| Quote: | "Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im
Newsbeitrag news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne
kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt
ist. Wozu braucht man den bei dieser Operation?
|
Gebraucht ist er nicht.
| Quote: | Daß das gelöscht Element mit Index i zuerst neu konstruiert wird
mit
dem Element i + 1 (über den Kopierkonstruktor), und dann operator=
zwischen diesen beiden aufgerufen wird kann ja wohl kaum Sinn
gewesen sein, oder?
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4
wäre, wo explicit gesagt wird, daß der Destruktor nur sooft
aufgerufen
wird, wie Elemente gelöscht werden. Bei meiner Variante müßte der
Destruktor aber ein zweites Mal aufgerufen werden, nämlich für das
letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
|
Vermütlich wegen eines Kopierens/Klebens von einer Stelle, wo es einen
Sinn hat.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Thu Dec 09, 2004 9:06 pm Post subject: Re: verhalten der vector klasse beim l366schenn^ |
|
|
<kanze (AT) gabi-soft (DOT) fr> schrieb im Newsbeitrag
news:1102600261.545934.62520 (AT) z14g2000cwz (DOT) googlegroups.com...
| Quote: | Thomas Mang wrote:
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im
Newsbeitrag news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
wenn ich die vector klasse benutze und ein element in der mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne
kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor erwähnt
ist. Wozu braucht man den bei dieser Operation?
Gebraucht ist er nicht.
|
Ich wage mich mal aus dem Fenster und behaupte, er kann gar nicht verwendet
werden. Die Spezifikation mit der Anzahl an Destruktoraufrufen verbietet
jegliche Kopierkonstruktor-Verwendung.
| Quote: |
Daß das gelöscht Element mit Index i zuerst neu konstruiert wird
mit
dem Element i + 1 (über den Kopierkonstruktor), und dann operator=
zwischen diesen beiden aufgerufen wird kann ja wohl kaum Sinn
gewesen sein, oder?
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4
wäre, wo explicit gesagt wird, daß der Destruktor nur sooft
aufgerufen
wird, wie Elemente gelöscht werden. Bei meiner Variante müßte der
Destruktor aber ein zweites Mal aufgerufen werden, nämlich für das
letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
Vermütlich wegen eines Kopierens/Klebens von einer Stelle, wo es einen
Sinn hat.
|
Dann ist aber die Spezifikation zu restriktiv und sollte verändert werden,
oder? (Nicht das ich eine Klasse kenne, wo der operator= nicht werfen kann
und der Kopierkonstruktor schon. Aber irgendwie komisch. Ob das einen DR
wert ist, kann ich nicht beurteilen.)
Thomas
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Dec 10, 2004 12:30 pm Post subject: Re: verhalten der vector klasse beim löschen |
|
|
Thomas Mang wrote:
| Quote: | kanze (AT) gabi-soft (DOT) fr> schrieb im Newsbeitrag
news:1102600261.545934.62520 (AT) z14g2000cwz (DOT) googlegroups.com...
Thomas Mang wrote:
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im
Newsbeitrag news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
wenn ich die vector klasse benutze und ein element in der
mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne
kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine
andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor
erwähnt
ist. Wozu braucht man den bei dieser Operation?
Gebraucht ist er nicht.
Ich wage mich mal aus dem Fenster und behaupte, er kann gar nicht
verwendet werden. Die Spezifikation mit der Anzahl an
Destruktoraufrufen verbietet jegliche Kopierkonstruktor-Verwendung.
|
Das meinte ich auch. Der Beweis dafür besteht aus einfacher
Arithmetik.
| Quote: | Daß das gelöscht Element mit Index i zuerst neu konstruiert
wird
mit dem Element i + 1 (über den Kopierkonstruktor), und dann
operator= zwischen diesen beiden aufgerufen wird kann ja wohl
kaum Sinn gewesen sein, oder?
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu
23.2.4.3/4 wäre, wo explicit gesagt wird, daß der Destruktor
nur
sooft aufgerufen wird, wie Elemente gelöscht werden. Bei meiner
Variante müßte der Destruktor aber ein zweites Mal aufgerufen
werden, nämlich für das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
Vermütlich wegen eines Kopierens/Klebens von einer Stelle, wo es
einen
Sinn hat.
Dann ist aber die Spezifikation zu restriktiv und sollte verändert
werden, oder? (Nicht das ich eine Klasse kenne, wo der operator=
nicht
werfen kann und der Kopierkonstruktor schon. Aber irgendwie komisch.
Ob das einen DR wert ist, kann ich nicht beurteilen.)
|
Wieso zu restriktiv? Sie verbietet nur, dass etwas geworfen wird, das
vom Zuweisungsoperator bzw. Copy-Konstruktor geworfen wird. Sie erlaubt
zu viel, indem sie erlaubt, dass eine Exception aus dem
Copy-Konstruktor
geworfen wird, obwohl der Copy-Konstruktor nicht benutzt werden darf.
(Dazu: wegen §17.4.4.8 und der Tatsache, dass erase() keine
exception-specification hat, darf in der Tat beliebige Ausnahmen
geworfen werden. Vor einiger Zeit war eine lange Diskussion zwischen
Herb Sutter, Dave Abrahams und mir darüber in clc++m.)
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Dec 10, 2004 1:02 pm Post subject: Re: verhalten der vector klasse beim löschen |
|
|
Thomas Mang wrote:
| Quote: | kanze (AT) gabi-soft (DOT) fr> schrieb im Newsbeitrag
news:1102600261.545934.62520 (AT) z14g2000cwz (DOT) googlegroups.com...
Thomas Mang wrote:
"Thomas Mang" <nospam (AT) nospam (DOT) prima.de> schrieb im Newsbeitrag
news:41b6f6d6$0$11094$3b214f66 (AT) usenet (DOT) univie.ac.at...
"Peter Dunker" <Peter.Dunker (AT) stud (DOT) tu-ilmenau.de> schrieb im
Newsbeitrag news:cp6i5d$k3c$1 (AT) piggy (DOT) rz.tu-ilmenau.de...
wenn ich die vector klasse benutze und ein element in der
mitte
lösche, wie verhält sich die klasse ??
1. die daten dahinter werden komplett ein element nach vorne
kopiert
Ja, so ist es. Zumindest fällt mir laut Spezifikation keine
andere
Möglichkeit ein.
Interessant ist, daß in 23.2.4.3/5 der Kopierkonstruktor
erwähnt
ist. Wozu braucht man den bei dieser Operation?
Gebraucht ist er nicht.
Ich wage mich mal aus dem Fenster und behaupte, er kann gar nicht
verwendet werden. Die Spezifikation mit der Anzahl an
Destruktoraufrufen verbietet jegliche Kopierkonstruktor-Verwendung.
|
Das meinte ich auch. Der Beweis dafür besteht aus einfacher
Arithmetik.
| Quote: | Daß das gelöscht Element mit Index i zuerst neu konstruiert
wird
mit dem Element i + 1 (über den Kopierkonstruktor), und dann
operator= zwischen diesen beiden aufgerufen wird kann ja wohl
kaum Sinn gewesen sein, oder?
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu
23.2.4.3/4 wäre, wo explicit gesagt wird, daß der Destruktor
nur
sooft aufgerufen wird, wie Elemente gelöscht werden. Bei meiner
Variante müßte der Destruktor aber ein zweites Mal aufgerufen
werden, nämlich für das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erwähnt?
Vermütlich wegen eines Kopierens/Klebens von einer Stelle, wo es
einen
Sinn hat.
Dann ist aber die Spezifikation zu restriktiv und sollte verändert
werden, oder? (Nicht das ich eine Klasse kenne, wo der operator=
nicht
werfen kann und der Kopierkonstruktor schon. Aber irgendwie komisch.
Ob das einen DR wert ist, kann ich nicht beurteilen.)
|
Wieso zu restriktiv? Sie verbietet nur, dass etwas geworfen wird, das
vom Zuweisungsoperator bzw. Copy-Konstruktor geworfen wird. Sie erlaubt
zu viel, indem sie erlaubt, dass eine Exception aus dem
Copy-Konstruktor
geworfen wird, obwohl der Copy-Konstruktor nicht benutzt werden darf.
(Dazu: wegen §17.4.4.8 und der Tatsache, dass erase() keine
exception-specification hat, darf in der Tat beliebige Ausnahmen
geworfen werden. Vor einiger Zeit war eine lange Diskussion zwischen
Herb Sutter, Dave Abrahams und mir darüber in clc++m.)
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
--
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 |
|
 |
Chris Theis Guest
|
Posted: Fri Dec 10, 2004 6:38 pm Post subject: Re: verhalten der vector klasse beim lschen |
|
|
"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb im Newsbeitrag
news:cp7lqg$65o$00$1 (AT) news (DOT) t-online.com...
| Quote: | Chris Theis wrote:
1. die daten dahinter werden komplett ein element nach vorne
kopiert
Ja, so ist es. Zumindest fllt mir laut Spezifikation keine andere
M glichkeit ein.
Interessant ist, da in 23.2.4.3/5 der Kopierkonstruktor erw hnt ist.
Wozu
braucht man den bei dieser Operation?
Da das gel scht Element mit Index i zuerst neu konstruiert wird mit
dem Element i + 1 (ber den Kopierkonstruktor), und dann operator=
zwischen diesen beiden aufgerufen wird kann ja wohl kaum Sinn gewesen
sein, oder?
Tut mir leid, aber wenn du Element i loeschen willst, warum sollte dann
das geloeschte Element mit dem Index i+1 neu konstruiert werden???
Nein. Umgekehrt wird ein Schuh draus. Wenn man das Element mit Index i
l scht, und das nicht das letzte Element war, gibt es nachher wieder ein
Element mit Index i, und zwar das, das vorher den Index i+1 hatte. Also
wird der Wert des Elements i+1 ins Element i kopiert, dann i+2 nach i+1,
u.s.w....
Ich glaube aucht, daß Thomas das gemeint hat.
Das
wuerde ja folgendes bedeuten:
1.) Element i wird in i+1 neu konstruiert
_aus_ i+1, nicht _in_
2.) Element i wird gloescht
3.) Element i+1 (welches ja nun die Werte vom gloeschten Element
beinhaltet!!) wird auf i kopiert.
Nun haben wir zwar ein Element eliminiert, aber die Werte von i+1
verloren
und dies kann wohl nicht der Sinn der Aktion gewesen sein.
Um meine Frage selbst zu beantworten:
Nein, kann es nicht gewesen sein da das ein Widerspruch zu 23.2.4.3/4
wre,
wo explicit gesagt wird, da der Destruktor nur sooft aufgerufen wird,
wie Elemente gelscht werden. Bei meiner Variante m te der Destruktor
aber
ein
zweites Mal aufgerufen werden, n mlich fr das letzte Element.
Warum zum Teufel wird da der Kopierkonstrukor erw hnt?
Wenn du den Standard genau liest, dann wird der Assignment Op & der copy
ctor im Rahmen von moeglichen Exceptions erwaehnt. Der Standard schreibt
den Effekt und die Komplexitaet vor, jedoch nicht wie die eigentliche
Implementierung dieser Operation aussieht.
Wenn aber gesagt wird, da?? nur genau ein Destruktor-Aufruf beim Löschen
erfolgt, kann kein Kopierkonstruktor beteiligt sein, da es für jeden
Konstruktoraufruf exakt ein Destruktoraufruf geben muß.
Schau mal in die Header Files deiner Standard Lib und dann wirst du
sehen
was dort genau passiert. Eine moegliche und vernuenftige
Implementierung
wuerde z.B. folgendes machen:
1.) Die Elemente i+1 bis end() werden auf Position i und folgend
kopiert.
2.) Loeschen des letzten nun ueberschuessigen Elements welches doppelt
vorliegt.
Wie laeuft nun die Kopieraktion ab:
Hier gibts die Moeglichkeit, dass entweder ein memmove() ausgefuehrt
wird, oder eine Schleife welche die Elemente z.B. ueber Assignment Op
kopiert. Dies wird in der Regel abhaengig von der
Iteratorimplementierung
gemacht. Das Anlegen der Elementkopien kann ja entweder per assignment
oder copy ctor gemacht werden, wobei die reale Implementierung ist dem
Standard ziemlich egal ist.
Nein, denn ein Copy-Kontruktor würde eine vorherige Zerstörung des Objekts
an der Zielposition erfordern, womit wir dann aber für jedes kopierte
Objekt einen zusätzlichen Destruktoraufruf hätten.
|
Okay, das hatte ich uebersehen, sorry! Aber warum wird dann wirklich der
copy ctor erwaehnt?
LG
Chris
--
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
|
|