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.
[ 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.
Hmmm, en wat zou dan de meest economische manier zijn om dat te doen ?.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
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.
Met een enkel statement gaat het niet lukken (voor zover ik weet), maar wat is er mis met: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.
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
"He took a duck in the face at two hundred and fifty knots."
Zoiets zeg maar:
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.
beetje zonde om steeds van voor af aan te beginnen met zoeken._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.
[ 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.
Aaargh, en ik maar denken dat die replace dan maar 1 karakter van die "oo" pakt._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");
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.
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.oisyn schreef op 23 juni 2003 @ 16:29:
[...]
beetje zonde om steeds van voor af aan te beginnen met zoeken.
( 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.
ja dat dacht ik eerlijk gezegd ookfarlane schreef op 23 juni 2003 @ 16:31:
Aaargh, en ik maar denken dat die replace dan maar 1 karakter van die "oo" pakt.
dit blijkt idd niet zo te zijn...
maar doe het dan zo:
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:
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.
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..oisyn schreef op 23 June 2003 @ 16:29:
beetje zonde om steeds van voor af aan te beginnen met zoeken.
http://www.icce.rug.nl/documents/cplusplus/ is ook wel aardig, staan ook hoofdstukken over strings/iostreams en meer van de STL in.farlane schreef op 23 June 2003 @ 16:31:
NB, Mag ik ff hierbij vermelden dat van het STL gedeelte van MSDN behoorlijk onduidelijk is ?
"He took a duck in the face at two hundred and fifty knots."
Ik beloof dat ik de volgende keer iets minder n00bitisch te werk zal gaan
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.
[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
Kijk bij de makers:farlane schreef op 23 juni 2003 @ 16:31:
NB, Mag ik ff hierbij vermelden dat van het STL gedeelte van MSDN behoorlijk onduidelijk is ?
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