Problem mit STL-Containern und const-parametern
-
hallo zusammen!
ich habe folgendes Problem zu dem ich bisher noch nichts gefunden habe und irgendwie auch total auf dem Schlauch stehe.
Ich habe in einer Klasse als Member diverse Container, die Pointer auf Objekte speichern, also z.b.std::vector<MyObject*> vec;In meinem konkreten Fall ist es zwar ein unordered_set, aber das dürfte nichts ändern, mit anderen Containern habe ich das Problem auch.
Nun möchte ich für diese Klasse, nennen wir sie MyClass, folgende Methode schreiben:bool MyClass::Exists(MyObject* o)Ich würde das ja gerne const-correct machen:
bool MyClass::Exists(const MyObject* o) const { return vec.count(o) != 0; }Das geht aber nicht. Der Compiler (GCC 4.1 btw) meckert mich an, dass ich beim Aufruf von Count() eine ungültige Konvertierung von const MyObject* nach MyObject* hätte.
Ich weiß nicht, warum er hier die nicht-const Variante von count() aufrufen will, da diese Methode nach einem Blick in die STL-header auch const-Überladen ist.
Das ganze leuchtet mir nicht ganz ein.
Verwende ich STL-Algorithmen (z.b. std::find()) funktioniert das tadellos, wobei doch dann eigentlich irgendwie das gleiche Problem auftauchen müsste.
Daher sieht meine Methode im Moment so aus, was mich aber nicht zufriedenstellt:bool MyClass::Exists(MyObject* o) const { return vec.count(o) != 0; }Ich glaube, ich übersehe irgendwas ganz einfaches

Würde mich freuen wenn jemand eine Lösung hat, denn ich will die Methode gerne wirklich const-correct umsetzen, und nicht nur halb.Grüße,
Andreas
-
Ich schätze mal, die count-Methode von vector (die ich im Übrigen gar nicht kenne, g++-Erweiterung?) sieht etwa so aus:
size_t count( const T& elem );Da dein Container Elemente vom Typ
MyObject*beinhaltet, will er als Argument auch einconst MyObject*&(das 'const' bezieht sich auf die Referenz), was natürlich nicht zusammenpasst mit dem const-Zeiger, den du übergibst..
Das ist eins von mehreren leidigen Problemen, die man mit Zeiger-Vektoren so erwischen kann. Evtl tut's std::count?
-
Badestrand schrieb:
Ich schätze mal, die count-Methode von vector (die ich im Übrigen gar nicht kenne, g++-Erweiterung?) sieht etwa so aus:
size_t count( const T& elem );Richtig. Vermutlich hat vector auch wirklich kein count(), ich habe nur den vector als Beispiel genommen, bevor ich 1000 Antworten bekomme mit "std::unordered_set kenne ich nicht, da verhält sich bestimmt alles ganz anders und es liegt daran"

Badestrand schrieb:
Das ist eins von mehreren leidigen Problemen, die man mit Zeiger-Vektoren so erwischen kann. Evtl tut's std::count?
Hmm, danke für die Erläuterung, irgendwas in der Art habe ich mir auch gedacht/befürchtet.
Die STL-Algorithmen (std::find, std::count) tun's auf jeden Fall, liefern ja das gleiche Ergebnis, ich bin mir nur nicht 100% sicher, ob die dann auch performancemäßig äquivalent sind? Könnte ja schon sein, dass die Container-Funktionen besser optimiert sind weil sie ja genau wissen, wie die unterliegende Implementierung funktioniert.
Weißt du da was dazu?Danke und Grüße,
Andreas