C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Rückwärts suchen in Bereichen von std::string

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andreas Seik
Guest





PostPosted: Sat Feb 04, 2006 4:00 pm    Post subject: Rückwärts suchen in Bereichen von std::string Reply with quote



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





PostPosted: Sat Feb 04, 2006 6:01 pm    Post subject: Re: Rückwärts suchen in Bereichen von st d::string Reply with quote



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





PostPosted: Sat Feb 04, 2006 9:06 pm    Post subject: Re: Rückwärts suchen in Bereichen vo n std::string Reply with quote



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





PostPosted: Sun Feb 05, 2006 4:35 pm    Post subject: Re: Rückwärts suchen in Bereichen von std::string Reply with quote

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





PostPosted: Mon Feb 06, 2006 2:03 pm    Post subject: Re: Rückwärts suchen in Bereichen von st d::string Reply with quote

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





PostPosted: Mon Feb 06, 2006 6:02 pm    Post subject: Re: Rückwärts suchen in Bereichen von st d::string Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.