Bestimmten String in std::vector ersetzen
-
Hallo,
kann mir bitte mal jemand einen Vorschlag geben, wie ich mal schnell ín einem std::vectorstd::string einen String mit einem anderen ersetzen kann ?

Über std::replace kann ich ja nur Chars ersetzen, ich will aber einen ganzen String:
vector<wstring> vCfgContent; strToWrite = L"Standard Scroll Bars (German)"; wifstream fRead; fRead.open(strCfgPath.c_str()); if (!fRead.is_open()) { GenerateErrorMessage(L"Config bearbeiten"); return false; } while (getline(fRead, temp)) vCfgContent.push_back(temp); fRead.close(); replace(vCfgContent.begin(), vCfgContent.end(), L"Standard Scroll Bars (English)", strCfgDir); // So geht das ja nicht !Ich habe absolut keine Idee !
Wer kann mir denn auf die Schnelle mal helfen ??
-
hier ist die fkt dokumentiert und nen bsp dazu findest du hier auch:
http://www.cplusplus.com/reference/algorithm/replace/
Kannst es ja noch ma versuchen und falls es dann noch immer nich klappen sollte, dich einfach noch ma melden...
bb
-
R3dNeXX schrieb:
replace(vCfgContent.begin(), vCfgContent.end(), "Standard Scroll Bars (English)", strCfgDir); // So geht das ja nicht !- Hast dus ausprobiert?
- Was heißt "geht nicht" (Fehlermeldung?)
-
Hm nunja, die Doku hab ich mir angeschaut, werde da aber trotzdem nicht weiter schlau daraus.
Ich kann mit std::replace ja Chars, Int, ... ersetzen, aber kein std::string !
Oder täusche ich mich ?
Gibts da andere Möglichkeiten oder Umwege ?Denn als Compiler-Error kireg ich mit Angabe von std:.string ja
MSVC schrieb:
error C2782: 'void std::replace(_FwdIt,_FwdIt,const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous
An den einfachen (?) Dingen scheiterts !

PS: Code oben editiert.
EDIT:
Da war jemand schneller !
zu 1.: Ja, habe ich !Aber gibts vielleicht ne Unicode-Variante davon ?
-
du kannst mit std::replace alles ersetzen was man vergleichen und kopieren kann. Also auch std:.strings.
In dienem Fall ist das problem lediglich, dass replace mit zweimal dem gleichen Typ als Parameter deklariert ist (nämlich dem Templateparameter _Ty), du aber einmal einen wchar_t* und einmal einen wstring lieferst. Er weiß daher nicht ob _Ty jetzt wchar_t* odert wstring sein soll. Zwei Lösungsmöglichkeiten gibts:- Du gibst den Templateparameter explizit an:
replace<wstring>(/* parameter wie gehabt*/) - Du konvertierst den char* in einen wstring, dann ist der Typ eindeutig:
[c]replace(vCfgContent.begin(), vCfgContent.end(), wstring(L"Standard Scroll Bars (English)"), strCfgDir);
Ich würd die zweite Möglichkeit bevorzugen.
- Du gibst den Templateparameter explizit an:
-
pumuckl schrieb:
du kannst mit std::replace alles ersetzen was man vergleichen und kopieren kann. Also auch std:.strings.
Ok, hätte mich ja auch gewundert ehrlich gesagt.
Perfekt, habe die 2. Möglichkeit benutzt und funktioniert so wie es soll !
Vielen Dank !
Hab irgendwie nicht drangedacht, den 2. Parameter in wstring zu casten !
War überzeugt, dass es funzt bei der Angabe des L (Makros ?).
-
R3dNeXX schrieb:
War überzeugt, dass es funzt bei der Angabe des L (Makros ?).
Ist kein Makro, sondern kennzeichnet das Ganze nur als Wstring-Literal (im Vergleich zum normalen String-Literal. Und Literale sind dank C-Historie char* bzw. wchar*
-
Ok, war noch ne kleine (versteckte) Frage.

Nochmals vielen Dank !
-
Hab irgendwie nicht drangedacht, den 2. Parameter in wstring zu casten !
es war der 3. parameter
und es war kein cast sondern lediglich ein aufruf eines konstruktors und damit eine (saubere) konvertierung...bb
-
Per Cast würde es doch genauso funktionieren !(?)
Und ich zähle aus Gewohnheit immer von 0 an (in der Programmierung).
Deshalb sagte ich 2.Parameter.
-
R3dNeXX schrieb:
Per Cast würde es doch genauso funktionieren !(?)
Ein Cast weist den Compiler nur an "wandle X in Y um" - je nachdem welcher Cast verwendet wird mit gewissen Restriktionen. In dem besagten Fall würde der Cast vom Compiler durch den selben Konstruktoraufruf realisiert werden den wir hier angegeben haben.
-
Ok, ich verstehe.
Danke !

Mir fehlts noch ziemlich an solchen Infos.