Map Familie



  • Hallo, ich habe versucht Familiennamen(key) und ihre Kinder(value) in einer Map abzuspeichern und sie dann ausgeben zu lassen.

    Meine Frage ist wie könnte ich diesen Code verbessern bzw. kürzen, abgesehen von den inkludierten Dateien.

    #include <set>
    #include <map>
    #include <string>
    #include <utility>
    #include <vector>
    #include <iostream>
    using namespace std;
    
    void clear() { cin.sync(); cin.clear(); }
    
    int main()
    {
    	string familienname;
    	string kindernamen;
    
    	map<string, vector<string>> Familie;
    	cout << "Familien Namen eingeben:";
    
    	while (cin >> familienname)
    	{
    		vector<string> Kinder;
    		cout << "Name des Kindes:";
    		clear();
    		while (cin >> kindernamen)
    		{
    			Kinder.push_back(kindernamen);
    			clear();
    			cout << "Name des Kindes:";
    		}
    
    		Familie.insert(pair<string, vector<string>>(familienname, Kinder));
    		clear();
    		cout << "Familien Namen eingeben:";
    	}
    
    	for (const auto& v : Familie)
    	{
    		cout << "\n\nFamilien Name: " << v.first << endl;
    		cout << "Kinder Namen: ";
    		for (auto& c : v.second)
    		{
    			cout << c << ",  ";
    		}
    		cout << endl << endl;
    	}
    
    	clear();
    	system("pause");
    }
    


    • cin.sync() ist plattformabhängig. Kann bei jemand anderen schon nicht mehr funktionieren. Darum nimmt man ignore + numeric_limits .

    • insert brauchst du nicht verwenden. Du machst einfach Familie[familienname].push_back(Kinder) . Wenn es den Key noch nicht gibt, wird er angelegt und der dazugehörge Value wird default konstruiert (eifnach ein leerer vector)

    - Der system -Befehl ist unperformant. Verwende ich nie. Allerdings gibt es gibt es keine perfekte Lösung, um ein Programm anzuhalten und auf eine Eingabe zu warten.

    - Wie beendest du die while -Schleifen?

    - Einige Sachen kommen öfters vor. Doppelt gemoppeltes auslagern.

    - Bei der zweiten range-based-for hast ein const vergessen.



  • Die Ausgaben die mehrmals erzeugt werden habe ich mit Absicht so platziert.
    Die Schleifen sollen mit STRG+Z beendet werden.



  • Wäre da multimap gut?



  • Stimmt, gleich Familiennamen gibt es ja mehrmals.

    Ich hätte noch eine Frage bezüglich Familie[kindernamen].push_back(Kinder),
    ist es besser als Familie.insert(pair<string, vector<string>>(kindernamen, Kinder);

    Die Map wird doch eigentlich sowieso sortiert, also steht es doch nicht fest ob es sich die neue Familie hinten, vorne, oder mittig befinden wird.


  • Mod

    Deswegen koennen maps ja auch "nur" insert und kennen kein push_back.

    Was aber wahrscheinlich besser waere, ware Familie.insert(pmake_pair(kindernamen, Kinder); . Ist ziemlich genau das gleiche, wie das, was du hast, aber eben viel weniger Schreibarbeit, weil die ganzen Templateargumente automatisch deduziert werden.


Log in to reply