std::string Zeile für Zeile in ein vector



  • Hallo!

    Wie geht Ihr vor, wenn Ihr an eine Klasse einen großen String, nehmen wir an:

    std::string aInhalt
    

    übergeben müßt, um es in ein vector

    vector<WDaten> vecBla;
    

    einzulesen?

    WDaten ist eine Klasse:

    class WDaten
    {
    public:
    	int beg;
    	int en;
    	Wert wWert;  // Wert ist ein typedef double 
                                    //(in einer h-Datei einer anderen Klasse).
    	int Sonstige;
    }
    

    Mein String baut sich folgendermaßen auf:

    "Begin Ende Wert Sonstige
    5556 6556 5 98
    5557 8756 9 97
    5599 6756 2 12
    6556 7556 1 88
    ...
    9998 9999 9 99"

    Ich habe es bis dato so gemacht, daß ich dieses std::string aInhalt Zeile für Zeile eingelesen, jeden Wert dieser einen Zeile für sich auseinandergefriemelt habe und in folgender if Schleife in mein vector vecBla eingelesen habe:

    snip:

    if(...) // mache so lange weiter, bis keine Daten mehr 
            //in std::string aInhalt vorhanden sind
    {
    	wDaten st1;
    	st1.beg = (int) temp1; //temp1 ist ein std::string
    	st1.en = (int) temp2;
    	st1.wWert = (float) temp3;
    	st1.Sonstige = (int) temp4;
    	vecBla.push_back(str1);
    }
    

    Aber irgendwie finde ich all das recht umständlich und (seeeehr) langsam. Gibt es eine bessere und effektivere Lösung hierfür?

    Danke!
    Peter



  • wDaten st1;
    st1.beg = (int) temp1; //temp1 ist ein std::string
    st1.en = (int) temp2;
    st1.wWert = (float) temp3;
    st1.Sonstige = (int) temp4;
    vecBla.push_back(str1);

    =>

    vecBla.push_back(wDaten()); // geht nur wenn Default-Ctor vorhanden, sonst mußt du ein Dummy-Objekt einfügen
    wDaten& temp = vecBla.back();
    temp.beg = ...
    temp.en = etc.
    

    Also erst einfügen, dann verändern. Dadurch entfällt eine Kopie, der ganze Kram könnte also locker doppelt so schnell werden. Ich habs allerdings noch nicht messtechnisch überprüft 😉

    PS: Das erste push_back könnte man auch in geeigneter Weise durch resize ersetzen, so dass das Objekt wirklich nur ein einziges mal konstruiert wird.



  • Ups!

    Tschuldige, aber ich programmiere noch nicht so lange in c++

    Wie muß ich das hier verstehen: 😕

    // geht nur wenn Default-Ctor vorhanden, sonst mußt du ein Dummy-Objekt einfügen

    Meinst Du so:

    class WDaten 
    { 
    public: 
        WDaten();   // user defined default ctor
    
        int beg; 
        int en; 
        Wert wWert;  // Wert ist ein typedef double  
                                    //(in einer h-Datei einer anderen Klasse). 
        int Sonstige; 
    }
    

    Wie fügt man sonst ein DUmmy-Objekt (wo) ein?

    Kannst Du

    Also erst einfügen, dann verändern. Dadurch entfällt eine Kopie...

    PS: Das erste push_back könnte man auch in geeigneter Weise durch resize ersetzen, so dass das Objekt wirklich nur ein einziges mal konstruiert wird.

    nochmal in andere Worte fassen?

    Danke!



  • PeterNeu schrieb:

    WDaten();   // user defined default ctor
    

    Wenn du vorher keinen default ctor deklariert hattest, und auch sonst keine Konstruktoren, dann erzeugt der Compiler selbständig einen. Der Punkt bei meinem Ausdruck ist einfach, dass wDaten() ein Objekt vom Typ wDaten erzeugen können muss, damit

    vec.push_back(wDaten());
    

    funktioniert.

    Wie fügt man sonst ein DUmmy-Objekt (wo) ein?

    wDaten Dummy; // oder anders, je nach Konstruktor ... 
    ...
    vec.push_back(Dummy);
    wDaten& temp = vec.back(); // Referenz auf das soeben eingefügte Element
    temp.beg = ...
    

    Das PS soll sowas wie

    vec.resize(vec.size() + 1);
    wDaten& temp = vec.back(); // Referenz auf das dazugekommene Element
    temp.beg = ..
    

    heißen. Dadurch wird der Konstruktor von wDaten nur einmal aufgerufen. Bzw. es wird keine Kopie erstellt, sondern direkt dort gearbeitet, wo das Objekt später liegen soll (im Vektor)



  • Habe verstanden! Vielen Dank für Deine Hilfe! 🙂

    Ich werde es gleich mal ausprobieren und hoffe das es dann schneller läuft.


Anmelden zum Antworten