 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Gebhart Guest
|
Posted: Thu Sep 16, 2004 9:26 pm Post subject: Pointer auf Eintrag einer Map |
|
|
Hi zusammen,
ich habe einen Pointer auf eine Map und möchte nun auf einen Eintrag
zugreifen und einen Pointer auf diesen Eintrag erhalten.
myMap ist ein Pointer auf die Map.
Ich hab das nun so gelöst:
&(*myMap)["key"]
Geht das auch einfacher?
Ich hatte an sowas gedacht wie: myMap["Key"] da myMap ja bereits ein Pointer
ist. Das funktioniert jedoch nicht :)
Gruß
Michael
--
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 |
|
 |
Vinzenz Feenstra Guest
|
Posted: Fri Sep 17, 2004 1:10 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Michael Gebhart schrieb:
| Quote: | Hi zusammen,
ich habe einen Pointer auf eine Map und möchte nun auf einen Eintrag
zugreifen und einen Pointer auf diesen Eintrag erhalten.
myMap ist ein Pointer auf die Map.
Ich hab das nun so gelöst:
&(*myMap)["key"]
Geht das auch einfacher?
Leider nicht. |
MfG Vinzenz Feenstra aka eViLiSSiMo
--
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 |
|
 |
Martin Kaul Guest
|
Posted: Fri Sep 17, 2004 8:15 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Michael Gebhart wrote:
| Quote: | Hi zusammen,
ich habe einen Pointer auf eine Map und möchte nun auf einen Eintrag
zugreifen und einen Pointer auf diesen Eintrag erhalten.
myMap ist ein Pointer auf die Map.
Ich hab das nun so gelöst:
&(*myMap)["key"]
Geht das auch einfacher?
Ich hatte an sowas gedacht wie: myMap["Key"] da myMap ja bereits ein Pointer
ist. Das funktioniert jedoch nicht
|
Auf jeden Fall musst immer den Pointer derefernzieren und dann via []
den index-operator der Klasse aufrufen.
Wenn dich "&(*myMap)["key"]" richtig stört, dann gibt es nocht die
Möglichkeit, den operator manuell aufzurufen, da er letztendlich auch
wie ne Methode angesprochen werden kann.
myMap->operator[]( "key" );
Ob das viel schöner ist.... ;-)
oder du gehst in zwei Schritten vor (vor allem wenn du öffters
hintereinander auf die Map zugreifen musst)
Map &myMapRef = *myMap;
myMapRef["key"] = ....
tschaule
Martin
--
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 |
|
 |
Martin Gieseking Guest
|
Posted: Fri Sep 17, 2004 8:39 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
| Quote: | ich habe einen Pointer auf eine Map und möchte nun auf einen Eintrag
zugreifen und einen Pointer auf diesen Eintrag erhalten.
myMap ist ein Pointer auf die Map.
Ich hab das nun so gelöst:
&(*myMap)["key"]
Geht das auch einfacher?
Ich hatte an sowas gedacht wie: myMap["Key"] da myMap ja bereits ein
Pointer ist. Das funktioniert jedoch nicht
|
Wenn Du sicher bist, dass ein Element mit dem gewünschten key existiert
und es nur gelesen werden soll (operator[] erzeugt ja ggf. ein neues map-
Element), kannst Du auch folgenden Ausdruck verwenden:
&myMap->find("key")->second
Ob das nun intuitiver ist, sei mal dahingestellt.
In jedem Fall könntest Du aber eine Referenz auf die map verwenden, also
etwa so:
map<string,ValueType> &mapRef = *myMap;
Einen Elementzeiger bekommt man dann natürlich mit:
&mapRef["key"]
Das lohnt sich aber wohl nur, wenn mehrere Zugriffe in der Art
erforderlich sind. Sonst ist dein oben angegebener Ausdruck der beste
Kompromiss.
Grüße,
Martin
--
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 |
|
 |
Michael Gebhart Guest
|
Posted: Fri Sep 17, 2004 8:53 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Ok alles klar, danke für Eure Antworten.
Gruß
Michael
--
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 |
|
 |
Olaf Krzikalla Guest
|
Posted: Fri Sep 17, 2004 9:51 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Hi,
Martin Gieseking schrieb:
| Quote: | Wenn Du sicher bist, dass ein Element mit dem gewünschten key existiert
und es nur gelesen werden soll (operator[] erzeugt ja ggf. ein neues map-
Element), kannst Du auch folgenden Ausdruck verwenden:
Laß Dir die Klammerbemerkung mal in Zusammenhang mit dem von Dir davor |
gesagten nochmal auf der Zunge zergehen. Dann wirst Du einen Widerspruch
feststellen, denn der Ausdruck
| Quote: | myMap->find("key")->second
|
ist nie besser als myMap["key"]. Wenn "key" existiert, haben beide
Ausdrücke das gleiche Ergebnis (und vermutlich auch gleiche Laufzeit),
wenn "key" nicht existiert, hat der erste Ausdruck undefiniertes
Verhalten - und das ist natürlich schlechter als jedes definierte
Verhalten.
MfG
Olaf Krzikalla
--
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: Fri Sep 17, 2004 11:38 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Olaf Krzikalla wrote:
| Quote: |
ist nie besser als myMap["key"]. Wenn "key" existiert, haben beide
Ausdrücke das gleiche Ergebnis (und vermutlich auch gleiche Laufzeit),
wenn "key" nicht existiert, hat der erste Ausdruck undefiniertes
Verhalten - und das ist natürlich schlechter als jedes definierte
Verhalten.
|
Dennoch ziehe ich find, natürlich mit Prüfung auf Existenz, vor. Denn
ich mag meist das Verhalten von map nicht, mir implizit ein neues Objekt
mit diesem Key anzulegen.
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 |
|
 |
Martin Gieseking Guest
|
Posted: Fri Sep 17, 2004 11:53 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Olaf Krzikalla <Entwicklung (AT) reico (DOT) de> wrote in
news:414AB3B5.6161FDC (AT) reico (DOT) de:
| Quote: | Wenn Du sicher bist, dass ein Element mit dem gewünschten key
existiert und es nur gelesen werden soll (operator[] erzeugt ja ggf.
ein neues map- Element), kannst Du auch folgenden Ausdruck verwenden:
Laß Dir die Klammerbemerkung mal in Zusammenhang mit dem von Dir davor
gesagten nochmal auf der Zunge zergehen. Dann wirst Du einen
Widerspruch feststellen, denn der Ausdruck
myMap->find("key")->second
ist nie besser als myMap["key"]. Wenn "key" existiert, haben beide
Ausdrücke das gleiche Ergebnis (und vermutlich auch gleiche Laufzeit),
wenn "key" nicht existiert, hat der erste Ausdruck undefiniertes
Verhalten - und das ist natürlich schlechter als jedes definierte
Verhalten.
|
Sorry, aber ich habe nicht geschrieben, dass der Ausdruck "besser" als
ein anderer oder gleichwertig zum []-operator ist. Die Frage war, ob es
eine "elegantere" Schreibweise für eine bestimmte Aufgabe gibt. Kann man
sicherstellen, dass nur existierende Schlüssel verwendet werden, ist der
obige Ausdruck definiert und mit dieser Einschränkung gleichwertig zur
[]-Variante, evtl. sogar etwas schneller.
Die Beurteilung der "Eleganz" ist aber wohl eher eine subjektive und die
Frage nach dem Risiko ggf. undefiniertes Verhalten zu provozieren hängt
vom Kontext ab, in dem der Ausdruck verwendet wird.
So gesehen finde ich keinen Widerspruch in meinem ersten Posting, sondern
habe lediglich eine andere Auffassung bzgl. der Beurteilung
unterschiedlicher Programmierstile.
Martin
--
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: Sat Sep 18, 2004 9:02 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Olaf Krzikalla wrote:
| Quote: | Hi,
Martin Gieseking schrieb:
Wenn Du sicher bist, dass ein Element mit dem gewünschten key existiert
und es nur gelesen werden soll (operator[] erzeugt ja ggf. ein neues map-
Element), kannst Du auch folgenden Ausdruck verwenden:
Laß Dir die Klammerbemerkung mal in Zusammenhang mit dem von Dir davor
gesagten nochmal auf der Zunge zergehen. Dann wirst Du einen Widerspruch
feststellen,
|
Wo soll da ein Widerspruch sein?
| Quote: | denn der Ausdruck
myMap->find("key")->second
ist nie besser als myMap["key"].
|
Das Wort "besser" oder irgendetwas äquivalentes kann ich oben nicht finden.
| Quote: | Wenn "key" existiert, haben beide Ausdrücke das gleiche Ergebnis (und
vermutlich auch gleiche Laufzeit),
|
Ja, und genau das war das Ziel. Das gleiche Ergebnis mit einer anderen
Schreibweise zu erreichen.
| Quote: | wenn "key" nicht existiert, hat der erste Ausdruck undefiniertes Verhalten
- und das ist natürlich schlechter als jedes definierte Verhalten.
|
Daher ja oben die Einschränkung: "Wenn Du sicher bist, dass ein Element mit
dem gewünschten key existiert...".
--
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 |
|
 |
Olaf Krzikalla Guest
|
Posted: Mon Sep 20, 2004 10:44 am Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Hi,
nehmt das mal als Antwort auf alle drei Posts.
Rolf Magnus schrieb:
| Quote: |
Olaf Krzikalla wrote:
Hi,
Martin Gieseking schrieb:
Wenn Du sicher bist, dass ein Element mit dem gewünschten key existiert
und es nur gelesen werden soll (operator[] erzeugt ja ggf. ein neues map-
Element), kannst Du auch folgenden Ausdruck verwenden:
Laß Dir die Klammerbemerkung mal in Zusammenhang mit dem von Dir davor
gesagten nochmal auf der Zunge zergehen. Dann wirst Du einen Widerspruch
feststellen,
Wo soll da ein Widerspruch sein?
|
Dann zerhacke ich es mal in Aussage:
| Quote: | Wenn Du sicher bist, dass ein Element mit dem gewünschten key existiert
|
und Klammerbemerkung:
| Quote: | (operator[] erzeugt ja ggf. ein neues map-Element),
|
Wann erzeugt operator[] ein neues map-Element? Genau, wenn ein Element
mit dem gewünschten key nicht existiert. Aber genau das wurde ja
vorausgesetzt. Insofern widerspricht die Klammerbemerkung der
vorhergehenden Aussage.
Christoph Rabel schrieb:
| Quote: | Dennoch ziehe ich find, natürlich mit Prüfung auf Existenz, vor.
Jaja, _mit_ Prüfung der Existenz. Aber der originale Ausdruck machte |
eben genau das nicht.
Martin Gieseking schrieb:
| Quote: | Die Frage war, ob es
eine "elegantere" Schreibweise für eine bestimmte Aufgabe gibt.
Über Schreibweisen streite ich nicht. Mir ging es nur um Funktionalität |
und in diesem Zusammenhang um den Widerspruch in Deinen einleitenden
Worten.
MfG
Olaf Krzikalla
--
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: Mon Sep 20, 2004 12:58 pm Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Olaf Krzikalla wrote:
| Quote: | Hi,
nehmt das mal als Antwort auf alle drei Posts.
Rolf Magnus schrieb:
Olaf Krzikalla wrote:
Hi,
Martin Gieseking schrieb:
Wenn Du sicher bist, dass ein Element mit dem gewünschten key
existiert und es nur gelesen werden soll (operator[] erzeugt ja ggf.
ein neues map- Element), kannst Du auch folgenden Ausdruck verwenden:
Laß Dir die Klammerbemerkung mal in Zusammenhang mit dem von Dir davor
gesagten nochmal auf der Zunge zergehen. Dann wirst Du einen
Widerspruch feststellen,
Wo soll da ein Widerspruch sein?
Dann zerhacke ich es mal in Aussage:
Wenn Du sicher bist, dass ein Element mit dem gewünschten key existiert
und Klammerbemerkung:
(operator[] erzeugt ja ggf. ein neues map-Element),
Wann erzeugt operator[] ein neues map-Element? Genau, wenn ein Element
mit dem gewünschten key nicht existiert. Aber genau das wurde ja
vorausgesetzt. Insofern widerspricht die Klammerbemerkung der
vorhergehenden Aussage.
|
Nein. Die Klammerbemerkung ist die Begründung für den Rest. Man muß sicher
sein, daß das Element schon existiert, denn sonst wäre das Verhalten von
find anders als das von operator[], da find nicht wie operator[] ein neues
Element erzeugen würde. So habe ich das zumindest verstanden.
--
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 |
|
 |
Martin Gieseking Guest
|
Posted: Tue Sep 21, 2004 5:38 pm Post subject: Re: Pointer auf Eintrag einer Map |
|
|
Olaf Krzikalla <Entwicklung (AT) reico (DOT) de> wrote:
| Quote: | Wann erzeugt operator[] ein neues map-Element? Genau, wenn ein Element
mit dem gewünschten key nicht existiert. Aber genau das wurde ja
vorausgesetzt.
|
Wo wurde das vorausgesetzt?
| Quote: | Christoph Rabel schrieb:
Dennoch ziehe ich find, natürlich mit Prüfung auf Existenz, vor.
Jaja, _mit_ Prüfung der Existenz. Aber der originale Ausdruck machte
eben genau das nicht.
|
Was mit der mittlerweile mehrfach erwähnten Einschränkung auch nicht nötig
ist. Wie gesagt, ging es mir nicht darum einen äquivalenten Ausdruck
anzugeben (steht ja auch nirgendwo), sondern einen Spezialfall, der ggf.
auf das Ausgangsproblem passt. Die Anmerkung in Klammern ("operator[]
erzeugt ggf. ein neues Element") sollte lediglich den Unterschied zwischen
den beiden Ausdrücken hervorheben, da klar sein sollte, dass die find-
Konstruktion dies gerade nicht macht...
| Quote: | Martin Gieseking schrieb:
Die Frage war, ob es
eine "elegantere" Schreibweise für eine bestimmte Aufgabe gibt.
Über Schreibweisen streite ich nicht. Mir ging es nur um
Funktionalität und in diesem Zusammenhang um den Widerspruch in Deinen
einleitenden Worten.
|
Tut mir leid, aber richtig schlau werde ich aus deiner Anmerkung immer noch
nicht. Genausowenig kann ich einen Widerspruch finden.
Gruß,
Martin
--
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
|
|