const_iterator und iterator von hash_map
-
Hallo,
wie kann ich denn auf einer hash_map ein find und dann ein anschließendes erase machen?
Für das find benötige ich ja einen const_iterator und fürs erase einen normalen iterator oder? Spielt das eine rolle wenn ich außerhalb der klasse einen find mache - brauche ich hier zwingend einen const_iterator?also ich versuche außerhalb einer klasse auf eine hash_map wie folgt zuzugreifen:
typename hash_map< Key, DATA<T>,HASH_FUNCTION>::const_iterator h_it; h_it = hash->Get_Hash_Map().find(My_Key); // Hier würde ich gerne den gefundenen iterator an die klasse Hash übergeben // um dort ein erase zu machen. nur geht das nicht auf const_iteratoren. wie kann ich vorgehen? hash->Erase_Element(h_it); // und in Klasse Hash: template <class T> void Hash<T>::Erase_Element(hash_map< Key, DATA<T>,HASH_FUNCTION>::iterator h_it) { m_hash_map.erase(h_it); }Nur kennt er auch hash_map< Key,DATA<T>,HASH_FUNCTION>::iterator als typ nicht?
-
Testo schrieb:
wie kann ich denn auf einer hash_map ein find und dann ein anschließendes erase machen?
hash_map kenne ich nicht. Aber unordered_map sollte das können.
Testo schrieb:
Für das find benötige ich ja einen const_iterator und fürs erase einen normalen iterator oder?
Wie gesagt, ich kenne hash_map nicht. hash_map ist nicht Teil des C++ ISO Standards. unordered_map ist Teil des kommenden Standards. unordered_map bietet 2 find-Funktionen an (const/nonconst overload). Das erase nimmt einen const_iterator und genauso wie bei Zeigern, gibt es (sollte es geben) eine implizite iterator->const_iterator Konvertierung.
Testo schrieb:
template <class T> void Hash<T>::Erase_Element(hash_map< Key, DATA<T>,HASH_FUNCTION>::iterator h_it) { m_hash_map.erase(h_it); }Nur kennt er auch hash_map< Key,DATA<T>,HASH_FUNCTION>::iterator als typ nicht?
Bei Dir fehlt ja auch ein
typename. Der Typ hash_map<Key,DATA<T>,HASH_FUNCTION> hängt vom Templateparameter T ab. Dementsprechend musst Du pertypenamesagen, dass sichiteratorauf einen Typ bezieht und nicht etwa eine auf Funktion oder Objekt.kk
-
Danke für die erste Hilfe.
Gut der typename fehlt ja. Aber mir geht es eher darum dass ich einen const_iterator übergebe an Erase_Element und dann in Erase_Element in der signatur nur einen ::iterator definiere. Das geht doch so nicht. Ich brauche aber einen ::iterator weil ich ja ein erase mache. Wie kann ich das lösen bezüglich dem const_iterator.
-
Wieso brauchst du einen const_iterator, um ein Element zu löschen?
-
ich brauche eben kein const_iterator.
Ich befinde mich in einer externen klasse und rufe ein find auf der hash_map auf. Zu diesem find ist ein const_iterator nötig. Gleichzeitig will ich aber das gefundene element löschen. Zum erase() bruache ich jetzt aber einen normalen iterator. Verstehst du mein problem?
-
Was soll man dazu noch sagen? Entweder beschwerst Du Dich bei dem, der hash_map geschrieben hat (Microsoft?) oder Du nimmst einfach stattdessen unordered_map!
-
nein. wenn man die methoden in die klasse auslagert kann man auch mit einem normalen iterator auf der hash_map ein find ausführen. Trotzdem danke für die Hilfe.
-
In die Klasse auslagern?

Wenns deine Klasse ist: Implementier doch einfach das erase mit dem const_iterator, ich sehe da kein Problem. Wenn sichs irgendwo beißt, dann nimm nen const_cast, ich meine mich erinnern zu können, dass der erforderlich ist.
-
der standard fordert das ein iterator immer in einen const_iterator konvertierbar sein muss. Wnen deine Klasse das nicht erfüllt, ist das nicht das Problem des Standards
