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.