Bestimmten String in std::vector ersetzen



  • R3dNeXX schrieb:

    replace(vCfgContent.begin(), vCfgContent.end(), "Standard Scroll Bars (English)", strCfgDir);    // So geht das ja nicht !
    
    1. Hast dus ausprobiert?
    2. 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:

    1. Du gibst den Templateparameter explizit an: replace<wstring>(/* parameter wie gehabt*/)
    2. 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.



  • 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.


Anmelden zum Antworten