 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Seik Guest
|
Posted: Sat Feb 04, 2006 4:00 pm Post subject: Rückwärts suchen in Bereichen von std::string |
|
|
Hallo NG,
Angenommen, ich möchte das letzte Zeichen eines std::string suchen, welches
Element einer anderen Menge von Zeichen ist.
Ich möchte die Suche aber auf einen Teilbereich einschränken, ohne einen
Kopie erzeugen zu müssen.
Dabei ist zunächst nicht wichtig ob die Suchgrenzen durch size_type oder
iteratoren bestimmt werden.
Die Member von std::string erlauben Rückwärtssuche*, aber keine Suchgrenzen.
Die Algorithmen erlauben Suchgrenzen aber keine komplexe Rückwärtssuche.
Zumindest habe ich nichts gefunden.
Muss ich die Routine selbst implementieren?
Danke
Andreas
*mit Rückwärtssuche meine ich die Suche nach den letzten Elementen mit einer
bestimmten Eigenschaft.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sat Feb 04, 2006 6:01 pm Post subject: Re: Rückwärts suchen in Bereichen von st d::string |
|
|
Andreas Seik wrote:
| Quote: | Angenommen, ich möchte das letzte Zeichen eines std::string suchen, welches
Element einer anderen Menge von Zeichen ist.
Ich möchte die Suche aber auf einen Teilbereich einschränken, ohne einen
Kopie erzeugen zu müssen.
Dabei ist zunächst nicht wichtig ob die Suchgrenzen durch size_type oder
iteratoren bestimmt werden.
Die Member von std::string erlauben Rückwärtssuche*, aber keine Suchgrenzen.
|
find_last_not_of usw. können immerhin eine Startposition angeben. Damit
ginge dann
std::string::size_type pos = s.find_last_not_of("fobar", startpos);
if (pos < endpos)
/* was gefunden */;
| Quote: | Die Algorithmen erlauben Suchgrenzen aber keine komplexe Rückwärtssuche.
|
Du kannst dir über Reverse-Iteratoren aus jeder Vorwärtssuche eine
Rückwärtssuche machen.
| Quote: | Muss ich die Routine selbst implementieren?
|
Wenn du allzuviele Komponenten zusammensteckst, besteht die Gefahr, dass
du in einer grottenlahmen Standardimplementierung landest. Bei den
Standard-Funktionen von std::string besteht immerhin die Möglichkeit,
dass du optimierte schnelle Versionen erwischst.
Warum ist Erstellen einer Kopie (aka 's.substr(startpos, laenge)') keine
Option?
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Ernst Murnleitner Guest
|
Posted: Sat Feb 04, 2006 9:06 pm Post subject: Re: Rückwärts suchen in Bereichen vo n std::string |
|
|
In solchen Fällen drehe ich den String mit mirror() um und dann wieder
zurück.
Ernst
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Andreas Seik Guest
|
Posted: Sun Feb 05, 2006 4:35 pm Post subject: Re: Rückwärts suchen in Bereichen von std::string |
|
|
Stefan Reuther wrote:
| Quote: | find_last_not_of usw. können immerhin eine Startposition angeben. Damit
ginge dann
std::string::size_type pos = s.find_last_not_of("fobar", startpos);
if (pos < endpos)
/* was gefunden */;
Führt aber unter Umständen zu sehr viel unnötigem Suchen. |
| Quote: | Du kannst dir über Reverse-Iteratoren aus jeder Vorwärtssuche eine
Rückwärtssuche machen.
Ich habe als Anleitung hier nur die STL kurz&gut von O'Reilly. |
Da steht z.B.:
Fwd1 find_first_of(Fwd1 first1, Fwd2 last1, Fwd2 first2, Fwd2 last2)
und weiter vorne: Fwd = Forward-Iterator
Angenommen ich habe jetzt zwei Random-Access-Iteratoren pos1 und pos2 mit
pos1 < pos2. Ich möchte von pos2(pos2 ausgeschlossen) ausgehend bis pos
(pos1 eingeschlossen) suchen und dabei find_first_of verwenden. first2 und
last2 seien gegeben.
Ich verstehe Dich so, dass das geht. Aber wie?
| Quote: | Warum ist Erstellen einer Kopie (aka 's.substr(startpos, laenge)') keine
Option?
|
Wäre dann eine Option, wenn die Kopie nicht "wirklich" erstellt würde. Wenn
also beide Strings weiter auf den selben Speicherbereich zeigen.
Ich habe keine Ahnung wie so etwas üblichweise implementiert ist.
Danke
Andreas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Olaf Krzikalla Guest
|
Posted: Mon Feb 06, 2006 2:03 pm Post subject: Re: Rückwärts suchen in Bereichen von st d::string |
|
|
Hi,
Andreas Seik wrote:
| Quote: | Du kannst dir über Reverse-Iteratoren aus jeder Vorwärtssuche eine
Rückwärtssuche machen.
Ich habe als Anleitung hier nur die STL kurz&gut von O'Reilly.
Da steht z.B.:
Fwd1 find_first_of(Fwd1 first1, Fwd2 last1, Fwd2 first2, Fwd2 last2)
und weiter vorne: Fwd = Forward-Iterator
Hier liegt wohl ein Mißverständnis vor. Die std lib kennt prinzipiell |
drei Iterator-Konzepte: forward (Merkmal: nur operator++), bidirektional
(Merkmal: forward iterator und operator--), und random-access
(bidirektional und operator+=(int), operator-=(int) ) [die Theoretiker
unter uns mögen mir diese verkürzte Darstellung verzeihen]. Nun ist es
zumindest in der std lib so, dass zu jedem Iterator ein dazugehörender
Reverse-Iterator gehört, der das ursprüngliche Iterator-Konzept erbt. Wo
also ein forward-Iterator einsetzbar ist, ist auch ein
reverse-forward-Iterator einsetzbar.
Ich würde auf jeden Fall mit irgendwas in der Form:
const char suche[] = "foobar";
find_first_of (s.rbegin(), s.rend() - startpos, suche, suche+6);
beginnen. Warum der Stefan meint, dass soetwas langsamer als substr ist,
weiß ich nicht.
MfG
Olaf Krzikalla
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Mon Feb 06, 2006 6:02 pm Post subject: Re: Rückwärts suchen in Bereichen von st d::string |
|
|
Olaf Krzikalla wrote:
| Quote: | const char suche[] = "foobar";
find_first_of (s.rbegin(), s.rend() - startpos, suche, suche+6);
beginnen. Warum der Stefan meint, dass soetwas langsamer als substr ist,
weiß ich nicht.
|
Weil die Wahrscheinlichkeit, dass die Standardbibliothek eine optimierte
Spezialisierung von
std::string::find_last_of(const char*, std::string::size_type)
enthält, doch um einige Größenordnungen größer ist, als dass sie eine
Spezialisierung für
std::find_first_of(std::reverse_iterator<std::string::iterator>,
std::reverse_iterator<std::string::iterator>,
const char*, const char*);
enthält.
Stefan
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|