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 manignore
+numeric_limits
. -
insert
brauchst du nicht verwenden. Du machst einfachFamilie[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.
-
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.