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 

verhalten der vector klasse beim löschen

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





PostPosted: Wed Dec 08, 2004 9:39 am    Post subject: verhalten der vector klasse beim löschen Reply with 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

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





PostPosted: Wed Dec 08, 2004 12:43 pm    Post subject: Re: verhalten der vector klasse beim l366schenn^ Reply with 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...
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





PostPosted: Wed Dec 08, 2004 12:47 pm    Post subject: Re: verhalten der vector klasse beim löschen Reply with quote



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





PostPosted: Wed Dec 08, 2004 12:52 pm    Post subject: Re: verhalten der vector klasse beim l366schenn^ Reply with quote


"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





PostPosted: Wed Dec 08, 2004 1:35 pm    Post subject: Re: verhalten der vector klasse beim löschen Reply with quote

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





PostPosted: Wed Dec 08, 2004 3:30 pm    Post subject: Re: verhalten der vector klasse beim l366schenn^ Reply with quote


"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





PostPosted: Wed Dec 08, 2004 7:48 pm    Post subject: Re: verhalten der vector klasse beim löschen Reply with quote

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





PostPosted: Wed Dec 08, 2004 9:37 pm    Post subject: Re: verhalten der vector klasse beim l366schenn^ Reply with quote


"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





PostPosted: Thu Dec 09, 2004 1:51 pm    Post subject: Re: verhalten der vector klasse beim löschen Reply with quote

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





PostPosted: Thu Dec 09, 2004 9:06 pm    Post subject: Re: verhalten der vector klasse beim l366schenn^ Reply with quote


<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





PostPosted: Fri Dec 10, 2004 12:30 pm    Post subject: Re: verhalten der vector klasse beim löschen Reply with quote

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





PostPosted: Fri Dec 10, 2004 1:02 pm    Post subject: Re: verhalten der vector klasse beim löschen Reply with quote

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





PostPosted: Fri Dec 10, 2004 6:38 pm    Post subject: Re: verhalten der vector klasse beim lschen Reply with quote


"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
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.