vetor Datensatz bearbeiten?



  • Hallo,
    bin mal wieder an einer Stelle angekommen, wo ich einfach nicht weiter komme 😞
    Und zwar möchte ich von dem Zweidimensionalen vector Array ein bestimmten Datensatz bearbeiten/editieren, sagen wir mal "Muster". Wie könnte man das gescheit anstellen?

    struct Daten
    {
        int nummer;
    	std::string name;
    };
    
    int main()
    {
    	std::vector<Daten> datenVec;
    	Daten d1 = { 3, "Max" };
    	Daten d2 = { 6, "Muster" };
    	Daten d3 = { 9, "Klaus" };
    	Daten d4 = { 1, "Detlef" };
    
    	datenVec.push_back(d1);
    	datenVec.push_back(d2);
    	datenVec.push_back(d3);
    	datenVec.push_back(d4);
    
    	for (unsigned int i=0; i<datenVec.size(); i++)
    	{
    		printf("-> %d\t-> %s\n", datenVec[i].nummer, datenVec[i].name.c_str());
    	}
    
    	return 0;
    }
    

    vielen dank im voraus 😉

    MfG OloX



  • std::vector<Daten>::iterator iter = std::find(datenVec.begin(), datenVec.end(), value);
    


  • Okay,
    aber was seht für value ?



  • wenn das deiner komplette Datenklasse ist, dann würd ich zu einer map raten... dann hast du es gleich in sortierter Reihenfolge und bei großen Datensätzen einen schnelleren Zugriff auf die Elemente.

    Mit einer bidrektionalen Map (bspw die von boost: googlesuche nach boost dictionary) könntest du darüber hinaus auch nach dem "Value" also den Namen sortieren lassen



  • OloX schrieb:

    Okay,
    aber was seht für value ?

    std::vector<Daten>::iterator iter = std::find(datenVec.begin(), datenVec.end(), "muster");
    
    if( iter!=datenVec.end )
     cout << iter.nummer << endl; // ->6
    


  • Ach, verlesen. Hier müsste ein find_if mit Komparator hin.



  • Den Datensatz, den du wiederfinden und bearbeiten willst (dafür benötigst du allerdings den kompletten Datensatz oder einen Vergleichsoperator, der den für's wiederfinden relevanten Teil der Klasse vergleicht). Alternativ kannst du auch std::find_if() mit einer passend geschriebenen Vergleichsfunktion/Funktor verwenden.

    Aber je nachdem, was du eigentlich vorhast, könnte hier ein set<> oder map<> passender sein als ein vector<>.



  • Danke für die vielen Antworten.
    Boost möchte ich eigentlich nicht verwenden und der Typ soll vector bleiben.
    Die Index Nummer von "Muster" [1] ist ja bekannt. Ist das nicht einfacher möglich?



  • Wenn du den Index kennst, kannst du natürlich auch direkt darüber auf das Element zugreifen:

    datenVec[1].nummer = 4711;
    

    (dein erster Beitrag klang aber eher so, als ob der Eintrag "Muster" irgendwo im vector sein könnte - in dem Fall mußt du ihn natürlich erst finden)



  • omg, ist mir das peinlich 😃
    Habe heute irgendwie Tomaten auf den Augen :p

    Vielen DANK!


Anmelden zum Antworten