Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » std::string Zeile für Zeile in ein vector

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
30.07.2003, 13:09 Uhr
~Peter
Gast


Hallo!

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


C++:
std::string aInhalt



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


C++:
vector<WDaten> vecBla;



einzulesen?

WDaten ist eine Klasse:


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





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:

C++:

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


Bearbeitung von loddab:
cpp-Tags eingefügt

Dieser Post wurde am 30.07.2003 um 13:15 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.07.2003, 13:16 Uhr
~Peter
Gast


P.S.:

Der String setzt sich folgendermaßen zusammen:

"Begin Ende Wert Sonstige
5556 6556 5 98
5557 8756 9 97
5599 6756 2 12
6556 7556 1 88
...
9998 9999 9 99"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.07.2003, 13:22 Uhr
typecast
aka loddab
(Operator)


Vielleicht hilft dir das weiter: www.fun-soft.de/forum/showtopic.php?threadid=3373&time=1059564077


Bearbeitung von loddab:
Jetzt funktioniert es

--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)

Dieser Post wurde am 30.07.2003 um 13:35 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.07.2003, 13:29 Uhr
typecast
aka loddab
(Operator)


Kann mir mal einer erklären warum der Link nicht funktioniert? Ich hab doch nur Copy&Paste gemacht!
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.07.2003, 13:32 Uhr
virtual
Sexiest Bit alive
(Operator)


Mach mal ein s/PSPSESSID=&//g auf den Link: Sprich: entferne den SessionID Parameter aus der URL. Find ich auch ziemlich nervend.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.07.2003, 13:42 Uhr
~Peter
Gast


Hallo Loddab!

Leider hilft mir das nicht sehr. Es geht ja nicht um das Zerlegen von std::strings

Ich meine, mein Code läuft ja ohne weiteres, mich nervt einfach die "Geschwindigkeit", die mir sagt, ey das kann es nicht sein, es muß eine komfortablere und einfachere und schnellere Lösung geben.

Die (unerträglich langsame) Geschwindigkeit liegt meiner Meinung nach nicht am Zerlegen der Strings, sondern irgendwie an dieser if-Abfrage.

Verstehst Du?

Peter
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.07.2003, 13:47 Uhr
typecast
aka loddab
(Operator)


Schau dir mal den Beitrag von 0xdeadbeef an:

Zitat:
0xdeadbeef schrieb:

C++:
#include <string>
#include <sstream>

//...

std::string str = "Bla1 2 3 4", elem1;
std::stringstream mystream;
int zahl1, zahl2, zahl3;

mystream.str(str); //string, den mystream behandelt

mystream >> elem1 >> zahl1 >> zahl2 >> zahl3;




Damit kannst du den String zeilenweise einlesen und dann direkt in std1 reinparsen.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.07.2003, 14:07 Uhr
~Peter
Gast


Und was ist mit meiner Klasse class WDaten?

Meinst Du es etwa so?

if(..)
{
wDaten str;
vecBla.push_back(str);
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
30.07.2003, 14:11 Uhr
typecast
aka loddab
(Operator)


Das push_back kannst du direkt nach dem füllen von str machen. Aber wozu brauchst du den die if-Abfrage noch?
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.07.2003, 14:30 Uhr
0xdeadbeef
Gott
(Operator)


Ich würd mir glatt nen operator definieren:

C++:
//WDaten.h
#include <iostream>

using namespace std;

class WDaten
{
public:
    int beg;
    int en;
    Wert wWert;  // Wert ist ein typedef double
                                //(in einer h-Datei einer anderen Klasse).
    int Sonstige;
}
//Operator überladen
istream& operator>>(istream&, WDaten&);



C++:
//WDaten.cpp
#include "WDaten.h"

//Implementierung des neuen Operators
istream& operator>>(istream &is, WDaten &wd) {
    return is >> wd.beg >> wd.en >> wd.wWert >> wd.Sonstige;
}


Und nachher in der Anwendung:

C++:
#include <string>
#include <sstream>
#include <vector>
#include "Wdaten.h"

using namespace std;

//...

string aInhalt;
stringstream s;
vector<WDaten> vecBla;

s.str(aInhalt);
while(!s.eof()) {
    WDaten wdat;
    s >> wdat;  //Hier wird der oben definierte operator>> ausgeführt
    vecBla.push_back(wdat);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 30.07.2003 um 14:32 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: