Verschachtelter Vektor



  • Hallo liebes Forum,

    ich bin neu hier und stehe mal wieder vor einem Problem, bei dem ich nicht weiter weiß. Ich habe schon einiges durchsucht hier und auch über google, aber leider konnte ich nirgends verstehen, wie es funktioniert.

    Ich möchte folgendes erreichen:

    Ein Nutzer soll eine Liste von Personen mit Daten zu diesen Personen anlegen können. Jede Person soll in einem Vektor stehen. Also z.B. einem Vektor mit 4 Einträgen für Name, Vorname, Alter und Geschlecht. All diese Personen sollen wieder in einen Vektor geschrieben werden, so dass ich auf diese verschachtelten Vektoren zugreifen kann.

    Somit habe ich versucht, einen int-Vektor (PersonenID) und einen string-Vektor (Daten) zu verschachteln. Wie das geht, habe ich gelesen:

    vector<vektor<string> > Eigenschaft;
    

    Leider verstehe ich nicht, wie ich dann z.B. Person 1 hinzufügen kann. Und dann Person 2 etc

    Ich habe mir dann damit abgeholfen, zwei Vektoren einzeln zu erstellen:

    #include<iostream>
    #include<string>
    #include<vector>
    
    using namespace std;
    
    vector<int> Person;	
    vector<string> Eigenschaft;
    
    // Funktion zur Datenaufnahme deklarieren
    
    void NeuePerson(string name, string vorname, string alter, string geschlecht) {
    
    int anzahl;
    
    anzahl = Person.size();
    
    		Eigenschaft.push_back(name);
    		Eigenschaft.push_back(vorname);
    		Eigenschaft.push_back(alter);
    		Eigenschaft.push_back(geschlecht);
    
    		Person.push_back(anzahl);
    }
    
    int main() {
    
    	cout << "Herzlich Willkommen zum Personenspeicher!" << endl;
    
    	cout << "Dieses Programm kann Personen mit folgenden Daten speichern: Name, Vorname, Alter und Geschlecht" << endl;	
    
    	string a;
    	string b;
    	string c;
    	string d;
    
    	cout << "Bitte geben Sie die folgenden Daten ein:" << endl;
    	cout << "Name: ";
    	cin >> a;
    	cout << "Vorname: ";
    	cin >> b;
    	cout << "Alter: ";
    	cin >> c;
    	cout << "Geschlecht: ";
    	cin >> d;
    
    	NeuePerson(a, b, c, d);
    
    	cout << Person.size() << Eigenschaft.size() << endl;
    
    	cin >> a;
    
    	return 0;
    }
    

    Hat mich logischerweise nicht wirklich weiter gebracht.

    Kann mir jmd helfen?

    Viele Grüße

    Tobias



  • Mit verschachtelten Vektoren würde das ungefähr so gehen:

    vector<vector<string> > personen;
    
    vector<string> person;
    person.push_back(name);
    person.push_back(vorname);
    person.push_back(alter);
    person.push_back(geschlecht);
    
    personen.push_back(person);
    

    Die Personen durch einen vector<string> zu repräsentieren ist aber Unfug - dafür hat man schließlich Klassen geschaffen.



  • Nimm leiber eine map

    Die Nutzung sähe so aus:

    std::map<int, User> personen;    //Der int-Wert wäre deine ID, User wäre eine Klasse mit allen Daten
    
    personen[56] = User(/*hier dann die Infos*/);
    

    Das funktioniert auch, wenn z.B. die Id 56 noch nicht belegt ist.
    Und so kannst du auch id-Lücken haben.



  • Du könntest dir auch eine Klasse Human basteln. Wär viel schöner. 🙂

    gruß
    syntax



  • PuraVida schrieb:

    Jede Person soll in einem Vektor stehen. Also z.B. einem Vektor mit 4 Einträgen für Name, Vorname, Alter und Geschlecht.

    Nein sollte sie nicht. Eine Person ist eine Person, nicht eine Reihe von Strings. Zumal ein Alter keine Zeichenkette ist, ein Geschlecht auch nicht.



  • pumuckl schrieb:

    Zumal ein Alter keine Zeichenkette ist, ein Geschlecht auch nicht.

    Was wäre den bei dir Alter und Geschlecht, pumuckl?



  • Gugelmoser schrieb:

    pumuckl schrieb:

    Zumal ein Alter keine Zeichenkette ist, ein Geschlecht auch nicht.

    Was wäre den bei dir Alter und Geschlecht, pumuckl?

    naheliegend für das Alter wäre für mich ein unsigned int, sofern "einfache" Altersangaben in Form von Lebensjahren genügen. Für das Geschlecht würde ich wohl ein kleines enum erstellen.

    Natürlich kann man beides als string speichern, das zieht nur einen ewigen Rattenschwanz an Fehlerbehandlungen mit sich und sorgt nicht gerade für ein leichtes Verständnis des Codes.

    Felix



  • daddy_felix schrieb:

    Für das Geschlecht würde ich wohl ein kleines enum erstellen.

    Jup, würde ich auch nehmen.

    daddy_felix schrieb:

    naheliegend für das Alter wäre für mich ein unsigned int, sofern "einfache" Altersangaben in Form von Lebensjahren genügen.

    Das würde ich nicht nehmen, oder was willst du mit einem Alter rechnen?



  • Gugelmoser schrieb:

    daddy_felix schrieb:

    naheliegend für das Alter wäre für mich ein unsigned int, sofern "einfache" Altersangaben in Form von Lebensjahren genügen.

    Das würde ich nicht nehmen, oder was willst du mit einem Alter rechnen?

    am Geburtstag inkrementieren 😉


  • Mod

    Gugelmoser schrieb:

    daddy_felix schrieb:

    naheliegend für das Alter wäre für mich ein unsigned int, sofern "einfache" Altersangaben in Form von Lebensjahren genügen.

    Das würde ich nicht nehmen, oder was willst du mit einem Alter rechnen?

    Mit einem Alter kann man schon sinnvolle Rechnungen machen, daher ist ein arithmetischer Typ hier absolut naheliegend.



  • SeppJ schrieb:

    Gugelmoser schrieb:

    daddy_felix schrieb:

    naheliegend für das Alter wäre für mich ein unsigned int, sofern "einfache" Altersangaben in Form von Lebensjahren genügen.

    Das würde ich nicht nehmen, oder was willst du mit einem Alter rechnen?

    Mit einem Alter kann man schon sinnvolle Rechnungen machen, daher ist ein arithmetischer Typ hier absolut naheliegend.

    Ok, für mich wäre das jetzt das Gleiche, wie mit einer PLZ gewesen. Und was fallen dir da für sinnvolle Rechnugnen ein, SeppJ?



  • Gugelmoser schrieb:

    Was wäre den bei dir Alter und Geschlecht, pumuckl?

    Geschlecht das angesprochene Enum, Alter je nach Bedarf ein unsigned int/unsigned long (unterschieliche Semantik denkbar: Jahre, Tage (echt oder Geschäftstage á 30 Tage/Monat), Sekunden?) oder auch eine eigene Datumsklasse.

    Gugelmoser schrieb:

    Das würde ich nicht nehmen, oder was willst du mit einem Alter rechnen?

    Ich schreibe Software für die Lebensversicherungsbranche - da ist das Alter der Versicherten Personen eine der wichtigsten Rechengrundlagen 😉


  • Mod

    Gugelmoser schrieb:

    Ok, für mich wäre das jetzt das Gleiche, wie mit einer PLZ gewesen. Und was fallen dir da für sinnvolle Rechnugnen ein, SeppJ?

    Wie alt jemand in 3 Jahren ist. Wie groß der Altersunterschied zweier Personen ist. Wann jemand doppelt so alt ist wie jetzt. In wie vielen Jahren jemand 65 wird. Wer von zwei Personen jünger ist. Wie lange jemand schon volljährig ist. Soll ich weitermachen?



  • Gugelmoser schrieb:

    Ok, für mich wäre das jetzt das Gleiche, wie mit einer PLZ gewesen. Und was fallen dir da für sinnvolle Rechnugnen ein, SeppJ?

    Die PLZ ist keine Zahl, da...
    a) Führende Nullen zulässig sind
    b) Wenn man andere Länder berücksichtigt ggf. auch Buchstaben zulässig sind.

    Dennoch halte ich bei eindeutig nummerischen Werten wie dem Alter (wobei ich eher den Geburtstag speichern, und das Alter herleiten würde), das man auch Nummern verwendet. Und sei es alleine schon, um die Eingaben auf gültige Werte einzuschränken. Man sollte nicht einfach alles als Strings behandeln, wenn andere Datentypen geeigneter sind.



  • Was wäre denn die alternative zu einem numerischen Typ?

    boost::posix_time::time_duration oder Vergleichbares könnte ich mir noch vorstellen.
    Ist aber auch bloss ein gewrappter "int", bei dem halt nur die Operationen angeboten werden die Sinn machen.
    Wobei das schon wieder lästig werden könnte, sobald man irgendwo die Varianz/Standardabweichung o.ä. ausrechnen will.

    Stellen sich folgende Fragen:

    1. Was gewinnt man durch eine Wrapperklasse?
    2. Was kostet es die Wrapperklasse zu erstellen? (u.U. nix, wenn man was fertiges nimmt)
    3. Was kostet es die Wrapperklasse zu verwenden? (u.U. viel, nämlich wenn man dann dauernd explizit rumkonvertieren muss)

    Dann kommt man zu dem Ergebnis dass es sich nicht auszahlt, und lässt es bleiben. Und steckt das Alter stattdessen in nen std::string, weil's ja sowieso immer nur eingegeben und ausgegeben wird 🤡


Anmelden zum Antworten