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 per typename sagen, dass sich iterator auf 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 🙂


Anmelden zum Antworten