Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » in string vektor leerzeichen mit semikolon ersetzen

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 <
000
04.11.2005, 20:52 Uhr
keboo




C++:
ifstream ifs("C:\\test1.txt");
  if (!ifs)
    return 1;

   std::vector<string> vec;

  vector<string> vec2;
  string str;
  
  


  //Einlesen
  while (!ifs.eof()) {
     getline(ifs, str);
     vec.push_back(str);
    replace(vec.begin(), vec.end(),' ',';');
//funktioniert nicht... was mache ich falsch??

    a++;
  }





Danke für eure Hilfe,

Johannes
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.11.2005, 23:04 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
der iterator mit dem replace deinen vector durchläuft liefert ja bei seiner Dereferenzierung ein Objekt vom Typ string.Insofern kann replace kein Leerzeichen finden.du müsstest replace auf dem string ausführen der hinter dem Iterator steht.
Eine (schnelle) Umsetzung könnte etwa so aussehen.

C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

struct string_replacer:public unary_function<string&,string&>
{
    string_replacer(char oldChar_,char newChar_):oldChar(oldChar_),newChar(newChar_){}
    string& operator()(string& str)
    {
        std::replace(str.begin(),str.end(),oldChar,newChar);
        return str;
    }
private:
    char oldChar;
    char newChar;
};

string_replacer replace_character(char oldChar,char newChar)
{
    string_replacer temp(oldChar,newChar);
    return temp;
}

int main()
{
    ifstream ifs("C:\\test1.txt");
    if (!ifs)
        return 1;
    
    vector<string> vec;
    string str;
    
    while (!ifs.eof()) {
    getline(ifs, str);
    vec.push_back(str);
    for_each(vec.begin(), vec.end(),string_replacer(' ',';'));
    }

    return 0;
}



Geht bestimmt noch besser,aber als Ansatz sollte der Code schon ganz ok sein.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 04.11.2005 um 23:06 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.11.2005, 09:36 Uhr
Spacelord
Hoffnungsloser Fall


Moin,
hab mir den Code heute morgen(nach nen paar Stunden Schlaf) nochmal angeschaut.
Ich denke mit den string Referenzen ist wohl doch nicht so toll.Für for_each ist es zwar nötig aber z.B. mit transform würde man sich ja den ursprünglichen vector verändern.
In diesem Fall ist es zwar erwünscht aber in anderen eventuell nicht.
Deshalb würde ich jetzt den Functor mit string Kopien füttern und for_each durch nen
in-place transform ersetzen.


[Interesse]
Wie ist das eigentlich mit transform?
Ich hab letztens mal nen Artikel gelesen dass der,transform übergebene,Functor keinerlei Seiteneffekte haben darf und transform auch keinerlei Zusagen über die Reihenfolge in der die Elemente abgearbeitet werden macht.Ist wohl im Standard so festgelegt.
Damit wollte man den Compilerherstellern das Türchen offenhalten transform mit mehreren Threads laufen zu lassen.Da dass aber wohl bis heute noch keiner gemacht hat ist wohl ein Grossteil des Codes,der transform nutzt,nicht wirklich standardkonform aber dennoch harmlos.
Sollten in Zukunft einige Compilerhersteller aber diese Möglichkeit nutzen dürfte so mancher wohl nen Hals kriegen weil sein alter Code auf einmal nur noch Mist macht.
Wenn man sich aber an die Vorgaben hält....was soll man mit nem Functor der nichts am Objekt ändern darf?
Also streng genommen wäre die in-place transform Variante ja auch nicht standardkonform weil die sequenz ja verändert wird.
Läuft aber trotzdem weil sämtliche Compilerhersteller transform so implementieren wie die "Allgemeinheit" transform benutzt und versteht.
Haltet ihr euch da so kleinlich dran?
Ich denke mal das ein Grossteil jetzt ohnehin zum ersten mal davon hört
[/Interesse]

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.11.2005, 21:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich gehe in der Regel davon aus, daß transform so implementiert wurde, daß die Elemente hintereinander durchlaufen werden, wenngleich der Standard dies nicht explizit fordert, so muß ich doch sagen daß ich jede andere Form der Iteration auch nicht sonderlich sinnvoll finden würde.

Im Standard steht ausserdem, daß der Operator keine Seiteneffekte haben sollte. So gesehen ist jeder Stateful Functor, dessen State beim Aufruf von op() verändert wird, ein Beispiel für einen Standardbruch. Aber auch diesen Erlaube ich mir.
--
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
004
06.11.2005, 10:34 Uhr
Spacelord
Hoffnungsloser Fall


So halte ich es auch,obwohl es ja eigentlich trivial wäre sich sein eigenes transform zu schreiben dass dieses(allgemein erwartete) Verhalten zeigt.
No risk -> no fun

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: