[ C++ / STL ] std::string.replace()

Pagina: 1
Acties:

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
Is het mogelijk om met std::string een replace te doen, zonder de string of gedeelten daarvan te kopieren naar een temporary ?

Wat ik wil is ongeveer dit:

C++:
1
2
3
4
5
string s1 = "Blaat !\r";

cout<<s1;
s1.replace( "a","oo");
cout>>s1


De output zou dan moeten zijn:

Blaat !
Bloooot !

Ik zit zelf telkens te ouwehoeren met string::replace in een while loop, maar dat is eigenlijk geen mooie oplossing, en bovendien kun je daarmee volgens mij niet een character vervangen door meerdere andere characters.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Temporary geheugen zul je sowieso nodig hebben, aangezien het best voor kan komen dat de resulterende string niet in de buffer van de originele string past (niet met de replace functie overigens, zoals je zelf al aangaf)

[ Voor 18% gewijzigd door .oisyn op 23-06-2003 16:17 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
.oisyn schreef op 23 June 2003 @ 16:14:
Temporary geheugen zul je sowieso nodig hebben, aangezien het best voor kan komen dat de resulterende string niet in de buffer van de originele string past
Hmmm, en wat zou dan de meest economische manier zijn om dat te doen ?

Kopieren van de originale string totdat je het character vind en dan de repacement chars erbij aan plakken, net zolang totdat je originele helemaal verwerkt is ?

Is er een STL algoritme om dit te bereiken eigenlijk?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
farlane schreef op 23 June 2003 @ 16:06:
Ik zit zelf telkens te ouwehoeren met string::replace in een while loop, maar dat is eigenlijk geen mooie oplossing, en bovendien kun je daarmee volgens mij niet een character vervangen door meerdere andere characters.
Met een enkel statement gaat het niet lukken (voor zover ik weet), maar wat is er mis met:
C++:
1
2
3
string::size_type pos;
while ( ( pos = s1.find( 'a')) != string::npos)
    s1.replace( pos, 1, "oo");

Dit kan nog wel iets verbeterd worden (probeer maar eens "a" met "aa" te vervangen :)), maar voor "a" > "oo" werkt het ok.

"He took a duck in the face at two hundred and fifty knots."


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat ik meestal doe is idd een while loopje, waarin je een nieuwe string opbouwt uit de originele en wat je wilt replacen.

Zoiets zeg maar:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::string replace (const std::string & orig, const std::string & what, const std::string & replacement)
{
    size_t pos = 0, lpos = 0;
    std::string s;

    while ((pos = orig.find (what, lpos) != std::string::npos)
    {
        if (pos - lpos > 1)
            s.append (orig, lpos, pos - lpos);
        s.append (replacement);
        lpos = pos + what.size ();
    }

    if (lpos != orig.size ())
        s.append (orig, lpos, orig.size () - lpos);

    return s;
}


evt zou je de grootte van s van tevoren nog kunnen berekenen door het aantal elementen te tellen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

_Squatt_ schreef op 23 June 2003 @ 16:24:
[...]

Met een enkel statement gaat het niet lukken (voor zover ik weet), maar wat is er mis met:
C++:
1
2
3
string::size_type pos;
while ( ( pos = s1.find( 'a')) != string::npos)
    s1.replace( pos, 1, "oo");

Dit kan nog wel iets verbeterd worden (probeer maar eens "a" met "aa" te vervangen :)), maar voor "a" > "oo" werkt het ok.
beetje zonde om steeds van voor af aan te beginnen met zoeken.

[ Voor 10% gewijzigd door .oisyn op 23-06-2003 16:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
_Squatt_ schreef op 23 June 2003 @ 16:24:
[...]

C++:
1
2
3
string::size_type pos;
while ( ( pos = s1.find( 'a')) != string::npos)
    s1.replace( pos, 1, "oo");
Aaargh, en ik maar denken dat die replace dan maar 1 karakter van die "oo" pakt.


Thx. :)

NB, Mag ik ff hierbij vermelden dat van het STL gedeelte van MSDN behoorlijk onduidelijk is ?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
.oisyn schreef op 23 juni 2003 @ 16:29:
[...]


beetje zonde om steeds van voor af aan te beginnen met zoeken.
Ik zie dat je je bericht geedit hebt. Ik dacht ook dat je niet 1 char kunt vervangen door meerder chars, maar dat werkt dus wel :)

( Beetje onzorgvuldig van me om dat niet eerst te testen trouwens. Mijn excuses daarvoor )

[ Voor 14% gewijzigd door farlane op 23-06-2003 16:36 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane schreef op 23 juni 2003 @ 16:31:
Aaargh, en ik maar denken dat die replace dan maar 1 karakter van die "oo" pakt.
ja dat dacht ik eerlijk gezegd ook :D
dit blijkt idd niet zo te zijn...

maar doe het dan zo:

C++:
1
2
3
4
5
6
string::size_type pos, lpos = 0; 
while ( ( pos = s1.find( 'a', lpos)) != string::npos) 
{
    s1.replace( pos, 1, "oo");
    lpos = pos + 2;
}


of zoals in mijn functie:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
std::string & replace (std::string & str, const std::string & what, const std::string & repl)
{ 
    std::string::size_type pos, lpos = 0;
    std::string::size_type wsize = what.size (), rsize = repl.size ();

    while ((pos = str.find (what, lpos) != std::string::npos) 
    { 
        str.replace (pos, wsize, repl);
        lpos = pos + rsize;
    } 

    return str; 
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
.oisyn schreef op 23 June 2003 @ 16:29:
beetje zonde om steeds van voor af aan te beginnen met zoeken.
Inderdaad, duurt onnodig langer, en werkt dus niet goed als wat je wilt vervangen ook in de vervangende text zit. Maar als voorbeeldje om van te starten leek het me genoeg.
farlane schreef op 23 June 2003 @ 16:31:
NB, Mag ik ff hierbij vermelden dat van het STL gedeelte van MSDN behoorlijk onduidelijk is ?
http://www.icce.rug.nl/documents/cplusplus/ is ook wel aardig, staan ook hoofdstukken over strings/iostreams en meer van de STL in.

"He took a duck in the face at two hundred and fifty knots."


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 21:31
Ok thx allebei. :)

Ik beloof dat ik de volgende keer iets minder n00bitisch te werk zal gaan :D

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 19:41
Er was hier een lang topic over, waarin wasigh, mbravenboer en Alarmnummer een wedstrijdje deden wie de snelste replace-methode kon schrijven :/ Misschien dat je zo het topic kan vinden :)

  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Dat was dit topic volgens mij
[rml][ Java] code optimalisatie[/rml]

Gaat hier wel over Java, maar het gaat natuurlijk om de denkwijze en het efficienste algoritme voor de replace.

It’s nice to be important but it’s more important to be nice


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
farlane schreef op 23 juni 2003 @ 16:31:
NB, Mag ik ff hierbij vermelden dat van het STL gedeelte van MSDN behoorlijk onduidelijk is ?
Kijk bij de makers:

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1