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 überKey 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.
