Wie kann man einen gültigen Schlüssel hinzufügen, ohne einen Wert für eine std :: map anzugeben?

8

Ich habe eine std :: map, und ich möchte einen gültigen Schlüssel hinzufügen, um später darüber zu iterieren, aber ohne irgendeinen Wert zu geben (er wird später im Verlauf der Iterationen angegeben).

So mache ich es jetzt:

%Vor%

Wie kann ich das bitte tun?

Danke im Voraus.

    
Mister Mystère 26.08.2010, 16:10
quelle

4 Antworten

11

Ich bin mir nicht ganz sicher, was Sie mit "ohne Angabe eines Wertes" meinen, aber wenn Sie meinen, ohne explizit einen Wert zuzuweisen, dann tun Sie einfach

%Vor%

Dies funktioniert immer noch, d. h. es wird ein neuer Eintrag in der Karte erstellt, wenn es vorher noch keinen mit diesem Schlüssel gab. Der operator[] gibt nur einen Verweis auf den Wert zurück, so dass Sie ihm einen neuen Wert zuweisen können, aber denken Sie daran, dass bereits standardmäßig konstruiert wurde.

Wenn Sie andererseits meinen, dass Sie ausdrücken möchten, dass es keinen sinnvollen Wert gibt und anschließend einen gültigen Wert erhalten kann oder nicht, dann sehen Sie @ UncleBens Antwort .

    
Troubadour 26.08.2010, 16:16
quelle
7

Ich nehme an, etwas, was Ihnen helfen könnte, ist Boost.Optional .

%Vor%

Das Fehlen eines verfügbaren Standardkonstruktors ist kein Problem, standardmäßig ist optional leer.

    
UncleBens 26.08.2010 16:22
quelle
5
  

/ * Ich möchte das nicht machen, da ich eigentlich keinen Fließkomma-Typ * /

verwende

Verwenden Sie dann anstelle von std::map die std::set .

    
Dummy00001 26.08.2010 16:26
quelle
0

Es scheint so, als ob Sie wirklich eine std :: set oder std :: Liste von Schlüsseln haben möchten, und dann später über diese Menge iterieren, um Ihre Map zu erstellen.

Wenn dies aus irgendeinem Grund nicht akzeptabel ist, können Sie Ihren Float mit einem Objekttyp umschließen, der den Operator float () implementiert, und verschiedene Konvertierungsfunktionen für float, aber auch ein "good ()" -Flag oder dergleichen.

Wenn Ihre endgültigen Werte tatsächlich floats sind, könnten Sie die Werte auf +/- NaN als einfachen Platzhalter initialisieren.

Ich würde sagen, boost :: optional ist eine bessere Option für Produktionscode, aber es hängt von Ihren Anforderungen ab.

    
jkerian 26.08.2010 16:31
quelle

Tags und Links