Konstruktion eines eigenen Iterators



  • Ich habe eine Klasse geschrieben. Und Instanzen von dieser Klasse speichere ich in einer boost::unordered_map. Nun muss ich gelegentlich diese Map wie ein Array durchgehen. Dazu steht ja in der Boost Dokumentation ein Beispiel

    for(std::string::const_iterator it = x.begin();
                it != x.end(); ++it)
            {
                //mach was...
            }
    

    Das Problem, das ich jetzt habe (bin ziemlich C++ unerfahren) ist, dass ich nicht weiß wie man so einen Iterator baut. Hat da jemand einen Tip?



  • Geht es nicht, wenn du std::string durch boost::unordered_map<key,value> ersetzt? Halt für die Dereferenzierung einfach it->second statt *it nehmen.



  • Danke für die Antwort.

    Deine erste Frage verstehe ich nicht. Ich möchte nicht durch eine Sequenz von Map-Objekten iterieren, sondern durch eine Sequenz von Objekten die in einem Map-Objekt gespeichert sind.

    Wie funktioniert das mit dem it->second? Ist mir unbekannt.



  • Du brauchst keinen eigenen Iterator schreibe, da boost::unordered_map bereits einen zur Verfügung stellt. Genau wie Rotareti schon vermutet hat.

    Also schreibe einfach

    for( boost::unordered_map< Key, Mapped >::const_iterator it = x.begin();
                it != x.end(); ++it )
            {
                //mach was...
            }
    

    Key und Mapped musst Du natürlich durch Deine eigenen Typen ersetzen.
    Und anschließend - also da wo 'mach was ..' steht - greift man über

    Key k = it->first;
        Mapped reference = it->second;
    

    sowohl auf den Key, als auch auf den Wert zu. 'first' und 'second' sind die beiden Member des sogenannten 'value_type's der boost::unordered_map, die Dir Key und den Wert liefern.

    Gruß
    Werner



  • HändyÄndy schrieb:

    Deine erste Frage verstehe ich nicht. Ich möchte nicht durch eine Sequenz von Map-Objekten iterieren, sondern durch eine Sequenz von Objekten die in einem Map-Objekt gespeichert sind.

    Alle STL-Container, sowie mit Sicherheit auch die von Boost, bieten eine Iteratorschnittstelle an. Ich habe boost::unordered_map selbst noch nicht eingesetzt, aber nehme mal an das dies identisch wie bei der std::map ist.

    In einer map sind die Einträge als Wertepaar (std::pair) abgelegt, bestehend aus den Einträgen namens "first" (Erster Teil des Paars, hier der Schlüssel) und "second" (Zweiter Teil des Paars, hier der Wert). Das erst einmal dazu was ->second bedeutet.

    // Beispiel mit std::map
    std::map<int, std::string> testmap;
    
    // Jedes Schlüssel/Wertepaar ist als std::pair in der map abgelegt.
    // In diesen Fall: std::pair<int, std::string> mit den beiden Membern
    // first (hier der int-Schlüssel) und second (hier der string).
    
    for(std::map<int, std::string>::const_iterator it=testmap.begin, end=testmap.end(); it!=end; ++it) {
        std::cout << it->first << ", " << it->second << "\n";
    }
    


  • Vielen Dank für die Antwort. Funktioniert wunderbar. 👍


Anmelden zum Antworten