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 !
    
    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