std::map::iterator mit const first
-
Hi,
wieso ist first von der Map const? Ich habe eine bestehende Map und möchte die nachher auflösen. Jedoch würde ich gerne vom first nachher noch eine nicht-konstante Memberfunktion aufrufen. Das wird mir jedoch untersagt. Ich finde das nicht nett, weil ich die map danach ohnehin löschen möchte. Ich würde ja auch gerne einen Eintrag aus der map herausnehmen und dann trotzdem first ändern, wieso geht das nicht?
Wenn es um die Sortierung geht, woher weiß map dann, dass ich durch den Aufruf der Funktion etwas ändere, was die Sortierung betrifft? Mir erscheint die map etwas zu restriktiv, was das angeht. Wenn ich also etwas mache, was nicht die Sortierung ändert, sollte sich doch wohl kein Problem ergeben, oder? Dann wäre doch ein const_cast eigentlich vernünftig, um den unnötig hohen Qualifizierer für den Aufruf aufzulösen.
Oder kritisiert ihr jetzt, dass:
a) ich keine map nehmen sollte, wenn ich auch Mal first verändern möchte (wenn das bei Abschluss geschieht finde ich das aber irgendwie überkonsequent)
b) die Methode gar nicht const sein sollte, wenn sie nichts am Sortierzustand des Objekts ändert
-
Eisflamme schrieb:
Jedoch würde ich gerne vom first nachher noch eine nicht-konstante Memberfunktion aufrufen.
...
Wenn es um die Sortierung geht, woher weiß map dann, dass ich durch den Aufruf der Funktion etwas ändere, was die Sortierung betrifft?Wenn du für den Key eine nicht-konstante Memberfunktion aufrufst, wird dieser ja potentiell geändert, wodurch sich die Sortierung ändern kann. Genau aus diesem Grund ist der
value_typeeiner Map einpair<const Key,T>. Daher sehe ich nicht, warum du meinst, die Map wäre restriktiver wie sie sein müsste. Du wirst also nicht darumkommen, deinen Key vor dem Aufruf deiner nicht-konstanten Memberfunktion einmal zu kopieren.
-
Ein const_cast ist da glaub'ich falsch.
Und wenn du das, was du ändern willst, nicht die Sortierreihenfolge beeinflusst, warum ist es dann im Key?
Mach mal ein Anwendungsbeispiel.
-
krümelkacker schrieb:
Und wenn du das, was du ändern willst, nicht die Sortierreihenfolge beeinflusst, warum ist es dann im Key?.
Für den Fall wär doch ne Boost.Bimap nicht schlecht, oder?
-
Müssen alle Attribute eines Keys auch dazu dienen die Sortierung zu beeinflussen? Das sehe ich eigentlich nicht so. Die map wird hier für ein bestimmtes Mapping zwischen Verweisen auf eine Klasse zu Verweisen auf eine andere genutzt. Dieses Mapping ist aber nur in einem bestimmten Kontext notwendig.
Beispiel fällt mir leider keins ein. Wenn ich einfach meinen Kontext nehme, geht es da recht tief rein. Ganz grob beschrieben habe ich bestimmte Gruppen und eine Funktion, welche zu diesen etwas Bestimmtes asynchron berechnet. In der Klasse, welche diese Gruppen verwaltet - und somit auch die Berechnung anstößt - halte ich ein Mapping, wie die Gruppen zu einzelnen Thread-Handles stehen, um im Slot, der bei Beendigung eines Threads aufgerufen wird (und das Handle mitgibt) schauen zu können, um welche Gruppe es sich denn handelt. Das Mapping ist somit
std::map<ThreadHandle, Group*>(das Handle ist kopierbar)Wenn jetzt alle Gruppen neuberechnet werden sollen, möchte ich den entsprechenden ThreadHandles gerne mitteilen, dass sie ihre Berechnung abbrechen können. Das kann ich über die Abort-Methode vom Handle erledigen, die aber eben nicht konstant ist.
Meine aktuelle Lösung erstellt einfach in einer Schleife über die map jedes Mal eine Kopie vom Handle (ist günstig) und ruft darüber Abort() auf. Damit ist das Problem also eigentlich gelöst.
Edit: Boost.Bimap ist irgendwie wieder so ne Kanonenaktion, finde ich.

-
Dann statt dem Threadhandle einfach den Wert als Key nehmen, den du fuer die Sortierung verwendest und als value ein pair<Threadhandle, Group*>
-
Eisflamme schrieb:
Edit: Boost.Bimap ist irgendwie wieder so ne Kanonenaktion, finde ich.

Mit Kanonen auf Spatzen schiessen dürfte (soweit ich das Sprichwort richtig interpretiere) trotzdem seinen Zweck erfüllen, nicht? :p
Spaß beiseite, war nur eine allgemeiner Vorschlag zu KKs Problemstellung.
-
Shade of Mine:
Das ist prima. Wieso komme ich nicht auf so offensichtliche und einfache Lösungen?
-
Sone schrieb:
Mit Kanonen auf Spatzen schiessen dürfte (soweit ich das Sprichwort richtig interpretiere) trotzdem seinen Zweck erfüllen, nicht? :p
Nein, vor allem hat Bimap (bidirektionale Abbildung) überhaupt nichts mit dem Problem (Key ist
const) zu tun.