STL: Assoziative Container und find
-
Hallo!
Folgendes Problem: Ich habe mit einer Map eine einfache Container-Kette erstellt, die einen Key (Ort) und seine PLZ in einem pair-Struct in einer Map speichert. Jetzt soll der Benutzer einen Ort eingeben können und die PLZ ausgegeben haben. Doch als Ausgabe erfolgt immer "Nicht gefunden!", wenn ich jedoch den C-String durch ein handgeschriebenen Ort im Code ersetze, ist die PLZ vorhanden.
Der Code:#include <iostream> #include <utility> #include <map> using namespace std; int main() { char ort[10]; typedef map<char*, int> plz_map; plz_map plz; plz.insert(pair<char*, int>("Hannover", 12345)); plz["Muenchen"] = 54321; plz["Lehnin"] = 14797; cout << "PLZ suchen\nBitte Ort eingeben: "; cin.getline(ort, sizeof(ort)); map<char*, int>::iterator fund = plz.find(ort); if(fund != plz.end()) { // liefert "Nicht gefunden!" cout << ort << " wurde gefunden. PLZ: " << plz[ort] << endl; } else { cout << "Nicht gefunden!" << endl; } plz_map::iterator iter = plz.begin(); while(iter != plz.end()) { // zeigt alle Inhalte cout << iter->first << " : " << iter->second << endl; iter++; } cout << plz.count("Lehnin") << endl; // 14797 cout << plz.count(ort) << endl; // liefert 0 system("pause"); return 0; }Bin recht ratlos, hat jemand eine Idee, warum ein var = "Lehnin", count(var) eine 0 liefert, während count("Lehnin") den Wert findet?
-
Nimm std::string statt char*. Du kannst zwei char-arrays nicht mit = vergleichen. Und genau das macht std::map intern.
(std::string ist sogut wie immer gegenüber char* im Vorteil...)
-
The-Kenny schrieb:
Nimm std::string statt char*. Du kannst zwei char-arrays nicht mit = vergleichen. Und genau das macht std::map intern.
(std::string ist sogut wie immer gegenüber char* im Vorteil...)
Quatsch... std::map verwendet eine Vergleichsfunktionalität die über die Templateargument festgelegt werden kann. Da lässt sich auch was für const char* finden.
-
Danke, genau das wars. Noch ein Fehler in meinem Buch, grrr

-
David_pb schrieb:
The-Kenny schrieb:
Nimm std::string statt char*. Du kannst zwei char-arrays nicht mit = vergleichen. Und genau das macht std::map intern.
(std::string ist sogut wie immer gegenüber char* im Vorteil...)
Quatsch... std::map verwendet eine Vergleichsfunktionalität die über die Templateargument festgelegt werden kann. Da lässt sich auch was für const char* finden.
Ist mir bewusst, aber ich bin Faul und hatte nicht wirklich Lust viel zu tippen. Also habe ich es mir frei genommen, dies wegzulassen.
-
The-Kenny schrieb:
David_pb schrieb:
The-Kenny schrieb:
Nimm std::string statt char*. Du kannst zwei char-arrays nicht mit = vergleichen. Und genau das macht std::map intern.
(std::string ist sogut wie immer gegenüber char* im Vorteil...)
Quatsch... std::map verwendet eine Vergleichsfunktionalität die über die Templateargument festgelegt werden kann. Da lässt sich auch was für const char* finden.
Ist mir bewusst, aber ich bin Faul und hatte nicht wirklich Lust viel zu tippen. Also habe ich es mir frei genommen, dies wegzulassen.
Und stattdessem was komplett unsinniges zu schreiben?
-
David_pb schrieb:
Und stattdessem was komplett unsinniges zu schreiben?
Meine Güte. "komplett unsinnig" war das ja wohl kaum, nur nicht vollständig. Standardmäßig wird = verwendet und std::strings zu verwenden ist normalerweise auch keine schlechte Idee.
Also lass bitte das Herumgestänkere, danke.
-
Also gibt es auch keine Lösung, das mit C-Strings zu realisieren (nur so aus Interesse), oder kann man das mit 'nem Funktor und strcmp machen?
-
Ad aCTa schrieb:
Also gibt es auch keine Lösung, das mit C-Strings zu realisieren (nur so aus Interesse), oder kann man das mit 'nem Funktor und strcmp machen?
Letzteres ist kein Problem, wird sogar in der SGI-Doku zu map vorgezeigt. Aber std::string schadet normalerweise nicht.
-
nman schrieb:
David_pb schrieb:
Und stattdessem was komplett unsinniges zu schreiben?
Meine Güte. "komplett unsinnig" war das ja wohl kaum, nur nicht vollständig. Standardmäßig wird = verwendet und std::strings zu verwenden ist normalerweise auch keine schlechte Idee.
Also lass bitte das Herumgestänkere, danke.
Tut mir leid das ich "Herumstänkere". Der Tipp std:string zu verwenden war natürlich durchaus gut! Aber der Rest des Posts war nicht unvollständig sondern falsch. Standardmäßig wird im std::map nicht = sondern less verwendet. Klar läuft das im Endeffekt auf die Funktionalität von "=" raus, aber gerade Anfänger wollen sowas irgendwie gern falsch verstehen.
-
Okay, habe es mit einem eigenen Funktor mit C-Strings gelößt:
#include <iostream> #include <utility> #include <map> using namespace std; struct cmp { bool operator() (const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; int main() { char ort[10]; typedef map<char*, int, cmp> plz_map; plz_map plz; plz.insert(pair<char*, int>("Hannover", 12345)); plz["Muenchen"] = 54321; plz["Lehnin"] = 14797; cout << "PLZ suchen\nBitte Ort eingeben: "; cin >> ort; map<char*, int, cmp>::iterator fund = plz.find(ort); if(fund != plz.end()) { cout << ort << " wurde gefunden. PLZ: " << plz[ort] << endl; } else { cout << "Nicht gefunden!" << endl; } plz_map::iterator iter = plz.begin(); while(iter != plz.end()) { // zeigt alle Inhalte cout << iter->first << " : " << iter->second << endl; iter++; } cout << plz.count("Lehnin") << endl; // 14797 cout << plz.count(ort) << endl; // liefert 1 system("pause"); return 0; }