Struct // Map



  • Hacker schrieb:

    Der einzige semantische Unterschied zwischen class und struct besteht in den default-sichtbarkeiten ( struct public , class private ).

    Und die standardmäßige public Vererbung bei struct bzw. die standardmäßige private Vererbung bei class .



  • Ich hab da noch eine andere Frage. Und zwar wenn ich eine Map anlege

    map<string, string, string, string> _map_;
    
    _map_["hallo"] = "du", "da", "der";
    

    Kann man dann auf du, da und der einzeln zugreifen?



  • Und irgendwie hab ich noch das Problem, dass ich in einem Struct suchen will..



  • map<string, string, string, string>
    

    Biste vollkommen übergeschnappt? Was soll denn hier Key und was Value sein?



  • Ja, hab gemerkt, dass das wohl nicht so funktioniert wie ich dachte.



  • Kann mir jemand sagen, warum dieses nicht geht?

    map<string, string >::iterator it;
    	it = kfz.find(eingabe);
    


  • map<string, string >::iterator it; 
        it = kfz.find(eingabe);
    

    Eine Möglichkeit wäre, dass kfz const ist.
    Die andere, dass der Typ von kfz nicht std::map<std::string, std::string> ist...

    Zeig mal Code oder Fehlermeldung. Wenn du einfach schreibst, "funktioniert nicht", kann man doch nur abschätzen wo der Fehler ist 😡 ⚠



  • int main() 
    {
    
    	string eingabe;
    	cout << "Kennzeichen (AA-BB-123): ";
    	cin >> eingabe;
    
    	const int N = 5;
    	const char* x[N] = {"hr", "mr", "kb", "ks", "ab"};
    
    	string s = "";
    	int i = 0;
    	i = eingabe.find("-", 0);
    	s = eingabe.substr(0,i);
    
    	map< string, Info> kfz;
    
    	//Als Value Info hr()
    
    	//Schauen, ob der Landkreis vorhanden ist
    	map<string, string>::iterator it;
    	it = kfz.find();
    
    	system("pause");
    
    	return 0;
    }
    


  • Na ist doch klar: Die Iteratoren lassen sich (selbstverständlich) nicht ineinander konvertieren. Du musst schon

    map<string, Info>::iterator it;
    

    schreiben, oder noch besser (C++11 !):

    auto it = kfz.find(eingabe)
    

    Google mal automatic type deduction.

    Edit: Immer diese Flüchtigkeits-Rechtschreibfehler... 🙄



  • Ah, ja. Jetzt macht es Sinn, danke.

    Hab noch eine (doofe) Frage. Und zwar, wenn ich das

    const char* A = ...
    

    anlege, müsste es ja möglich sein, dass ich dann in meiner Map auf das A als Key zugreife?

    Also ich gebe HR ein, es wird aufgesplittet und dann möchte ich da auf mein Struct zugreifen,,



  • KeinNameMehrFrei schrieb:

    Ah, ja. Jetzt macht es Sinn, danke.

    Hab noch eine (doofe) Frage. Und zwar, wenn ich das

    const char* A = ...
    

    anlege, müsste es ja möglich sein, dass ich dann in meiner Map auf das A als Key zugreife?

    Also ich gebe HR ein, es wird aufgesplittet und dann möchte ich da auf mein Struct zugreifen,,

    Das mit dem ausplitten verstehen ich nicht ganz. Aber klar, da der Konstruktor von std::string für char const* nicht explicit ist, denke ich du kannst

    kfz["HR"]
    

    schreiben.



  • Naja, es wird ja ei komplettes Kennzeichen eingelesen, dann wird aber nur nach dem HR gesucht, ob dieses schon als Key bekannt ist.

    Allerdings fehlt mir so ein wenig die Überleitung zum Value, da ich dieses als Struct festgelegt habe

    in etwa so:

    struct Info
    {
    	int EW ;	//Einwohner
    	string NLK; //Name des Landkreises
    	string VS;	//Verwaltungssitz
    	Info hr() {
    		EW = 182622;
    		NLK = "Schwalm-Eder-Kreis";
    		VS = "Homberg";
    	}
    

    Mir fehlt der Schritt, wie ich von dem erkennen des "hr" zum struct hr() komm..



  • Du wirst wohl mal ein Buch in die Hand nehmen müssen und Dich mit der Standardbibliothek beschäftigen müssen.
    Du wärst auf jeden Fall schon weiter...

    KeinNameMehrFrei schrieb:

    Mir fehlt der Schritt, wie ich von dem erkennen des "hr" zum struct hr() komm..

    Es wird - so wie ich Dich bis hierher verstehe - kein struct hr geben.
    Die map macht eine Abbildung von Unterscheidungszeichen (hr, hb, ab, hh...) zu Objekten der Klasse Info:

    #include <iostream>
    #include <map>
    #include <string>
    
    struct Info{
      int EW ;    //Einwohner
      std::string NLK; //Name des Landkreises
      std::string VS;    //Verwaltungssitz 
    };
    
    int main(){
      typedef std::map<std::string, Info> map_t;
      // Frage: was passiert hier?
      map_t kennzeichen_info = {{"hr", {182622, "Schwalm-Eder-Kreis", "Homberg"}},
    			    {"eh", {42, "Kreis Entenhausen", "Entenhausen"}},
    			    {"hb", {560000, "Hansestadt Bremen", "Bremen"}}
      };
      auto iter = kennzeichen_info.find("eh");
      if (iter != kennzeichen_info.end()){
        const Info info = iter->second;  // Frage warum second?
        std::cout << info.EW << '\n'
    	      << info.NLK << '\n'
    	      << info.VS << '\n';
      } else
        std::cout << "nicht gefunden.\n";   
    }
    

    Herzlichst,
    Dein Schwalm-Eder-Kreis



  • Hallo mein lieber Schwalm-Eder-Kreis 😃

    Vielen Dank, ich habe bisher nur innerhalb des Structs Werte zugewiesen, ich dachte nicht, dass es möglich ist, über eine Map das Struct zu befüllen.

    👍



  • Mh, wäre aber auch zu schön, wenn alles funktioniert hätte.

    typedef map <string, Info> map_;
    	map_ kennzeichen = {{"hr", {182622, "Schwalm-Eder-Kreis", "Homberg"}},
    		{"mr", {251.080, "Marburg-Biedenkopf", "Marburg"}},
    		{"kb", {161.871 , "Waldeck-Frankenberg", "Korbach"}},
    		{"ks", {236.986, "Kassel", "Kassel"}},
    		{"fd", { 217.255, "Fulda", "Fulda"}}
    	};
    

    Fehler 1 error C2552: 'kennzeichen': Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht möglich

    Fehler 2 error C2078: Zu viele Initialisierungen

    In der Zeile map_ kennzeichen = {{ ... ist die erste geschweifte Klammer als Fehler markiert..

    Fehler 3 error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.



  • Hast du ein wenig übertrieben 🙂
    Mach die Copy-Initialization manuell. Also schön den Namen des Konstruktors, und dann erst die Liste in Brackets (Uniform-Initialization).



  • Also ist das obige Beispiel nicht ganz richtig?

    Dachte, dass das zulässig wäre.



  • KeinNameMehrFrei schrieb:

    Also ist das obige Beispiel nicht ganz richtig?

    Dachte, dass das zulässig wäre.

    Dachte ich auch. Mach es trotzdem anders, der Compiler hat (fast) immer Recht.



  • Das Beispiel ist schon korrekt - sonst "hätte ich lieber geschwiegen."

    Evtl. unterstützt Dein Compiler das nicht, oder es liegt an den ominösen Tausendertrennzeichen.

    Der Punkt war ja eh nicht die Initialisierung der std::map, sondern dass Du mitschneidest, dass Du Objekte der Klasse Info parametrisierst und in die map einfügst - mit dem Unterscheidungsdingsbums als Key.
    Die Daten für diese Objekte wirst Du ja wahrscheinlich eh erst zur Laufzeit generieren, z.B. über eine csv-Datei, die Du einliest.

    Viel Erfolg und mit besten Grüßen,
    Dein Schwalm-Eder-Kreis


Anmelden zum Antworten