015
28.07.2013, 18:12 Uhr
Hans
Library Walker (Operator)
|
Hi,
soweit wie ich das bisher sehe, hast du ein Verständnisproblem mit der map. Ich zitier mal mein Buch dazu:
Zitat: |
Die Klasse map<Key, T>, eingebunden durch den Header <map>, speichert Paare von Schlüsseln und zugehörigen Daten. Dabei ist der Schlüssel eindeutig, es kann also keine zwei Datensätze mit dem selben Schlüssel geben. map ist ein assoziativer Container: Die Daten werden durch direkte Angabe des Schlüssels gefunden.
|
Soweit mal mein Buch. Das Problem bei Dir ist, das Schlüssel bisher mehrfach auftreten. D.h. Du brauchst eine Möglichkeit um eindeutige Schlüssel zu generieren, damit alle Daten gespeichert werden können. Ich halte es für das Beste, wenn du dazu die ganze Zeile verwendest, und zwar bevor Du sie zerlegst. Etwa indem Du eine Prüfsumme berechnest, die du dann als Schlüssel verwendest.
Zum Verständnis der map hier auch noch ein Beispiel aus dem Buch:
C++: |
/* cppbuch/k28/sortedmap.cpp Beispiel zum Buch von Ulrich Breymann: Der C++ Programmierer; Hanser Verlag Diese Software ist freie Software. Website zum Buch: www.cppbuch.de/ */ #include<map> #include<string> #include<iostream> using namespace std;
// Zwei typedefs zur Abkürzung typedef map<string, long> MapType; // Vergleichsobjekt: less<string>() typedef MapType::value_type ValuePair;
int main() { MapType aMap; aMap.insert(ValuePair("Thomas", 5192835)); aMap.insert(ValuePair("Werner", 24439404)); aMap.insert(ValuePair("Manfred", 535353)); aMap.insert(ValuePair("Heiko", 635352723)); aMap.insert(ValuePair("Andreas", 42536347)); aMap.insert(ValuePair("Karin", 9273539)); // 2. Einfügen von Heiko mit einer anderen (Tel.Nummer wird // NICHT ausgeführt, weil der Schlüssel schon existiert. aMap.insert(ValuePair("Heiko", 1000000));
/* Wegen der auf einer Baumstruktur basierenden Implementierung ist die Ausgabe nach Namen sortiert. */ cout << "Ausgabe:\n"; auto iter = aMap.begin(); // Hier meckert g++; k.A. warum while(iter != aMap.end()) { cout << (*iter).first << ':' // Name << (*iter).second << endl; // Nummer ++iter; }
cout << "Ausgabe der Nummer nach Eingabe des Namens\n" << "Name: "; string derName; cin >> derName; cout << "Suche mit Iterator: "; iter = aMap.find(derName); // O(log N) if(iter != aMap.end()) { cout << (*iter).second << endl; } else { cout << "Nicht gefunden!" << endl; }
/* cout << "Suche mit operator[]() (Element muss existieren,\n" "andernfalls wird eine undef. Nummer (0) für den Namen angelegt): "; cout << aMap[derName] << endl; // O(log N) */ // im neuen Standardentwurf C++0x: try { cout << "Suche mit at(): " << aMap.at(derName) << endl; // O(log N) } catch(const exception& e) { cout << "Nicht gefunden! Exception: " << e.what() << endl; } }
|
Soweit mal das. Das Programm ist im Buch auf Seite 786 abgedruckt, und steht (derzeit, also 2013) auch im Downloadbereich der Webseite zum Buch zur Verfügung (tar-archiv).
Hier die genauen Daten zum Buch: U.Breymann, Der C++ Programmierer, 2. Auflage, Hanser 2011, ISBN: 978-3-446-42691-7 Der zitierte Text steht auf Seite 782. -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. |