2010-06-17 4 views
22

In C++, warum gibt string::findsize_type zurück und kein iterator?Warum ist string :: find return size_type und kein Iterator?

Es wäre sinnvoll, da Funktionen wie string::replace oder string::insert nehmen Iteratoren als Eingabe machen, so dass Sie einige Zeichen find konnte und sofort die zurückgegebene Iterator replace passieren usw.

Auch std::find gibt einen Iterator - warum ist std::string::find anders?

Antwort

5

Es ist wahrscheinlich nützlicher, eine Nummer von suchen zu bekommen, denn dann können Sie den [] Operator oder substr() verwenden, um zu den Zeichen zu gelangen, die Sie gerade gesucht haben.

Auch, wenn Sie einen Iterator möchten, können Sie immer tun begin() + pos

+3

Sie sagen also, die schlechte Schnittstelle von 'string :: find' ist eigentlich gut, weil sie gut mit der schlechten Schnittstelle von' string :: substr 'interagiert? ;) – Praxeolitic

+0

Ich möchte nicht mit Iteratoren herumspielen, wenn ich nur die ersten zwei Buchstaben einer Zeichenkette erhalten möchte – shoosh

+0

mag es: begin() + pos – fchen

0

Ich nehme an, es ist, weil in der Regel Zeichenfolge Mitglieder auf Indizes arbeiten, anstatt Iteratoren und das macht es leicht, den zurückgegebenen Wert zu verwenden. Sie können immer std::find verwenden, wenn Sie einen Iterator erhalten möchten.

+0

Ich wollte nur sagen, dass 'std :: vector' auch inhärent auf Indizes funktioniert und size_type nicht zurückgibt, wenn Sie nach etwas suchen - aber dann erinnerte ich mich, dass Vektor überhaupt nicht find() hat. Wundert sich, warum 'string' es hat ... – Frank

+1

@dehmann: Es hat es aus historischen Gründen. 'std :: string' war zuerst (dann' std :: basic_string') und dann kam die STL mit ihren Iteratoren. Als entschieden wurde, die STL in den Standard aufzunehmen, wurde sie tatsächlich als kurz vor der Fertigstellung betrachtet. (Die Einführung der STL verzögerte sie um etwa ein Jahr.) Es wurden bereits Implementierungen von 'std :: basic_string' verwendet. So wurden die Änderungen minimal gehalten und meist nur ergänzt. – sbi

25

Das Design der glänzend neuen Zeichenklasse der Standardbibliothek wurde bereits durchgeführt, als Stroustrup das Standardkomitee zur STL einführte. Das Komitee gefiel das STL und begann es in den Standard zu integrieren, wodurch vieles von dem übernommen wurde, was sie bereits vereinbart hatten (und wahrscheinlich auch den Standard für ein oder zwei weitere Jahre verschieben würde).

Neben anderen Änderungen wurden Iteratoren der bereits fertigen String-Klasse als ein Nachdenken hinzugefügt. Sie können dies sehen, indem Sie die verschiedenen String-Mitglieder betrachten, die eine Position einnehmen/zurückgeben - es ist eine wilde Mischung aus Indizes und Iteratoren.

Es ist nicht immer einfach zu erraten, warum einige Member-Funktionen nur Index-nimmende Versionen haben und einige Iterator-take-Versionen. Im Fall von std::basic_string<>::find() scheint es jedoch einfach zu sein: Da std::find() bereits einen Iterator zurückgibt, wurde std::basic_string<>::find() unverändert belassen.

+0

Ihr letzter Absatz ist verwirrend. Meinst du, es macht Sinn, basic_string <> :: find() return size_type zu haben, weil std :: find() bereits einen Iterator zurückgibt und die Designer dieses Verhalten nicht duplizieren wollen? Wäre es nicht sinnvoll, sie ähnlich zu machen, um die Konformität und Benutzerfreundlichkeit der Bibliothek zu verbessern? – Frank

+0

@dehmann im Grunde, wenn Sie Iterator verwenden müssen std :: find(), wenn Sie index verwenden müssen std :: basic_string <> :: find() –

+5

Und 'string' ist sowieso schlecht entworfen ... –

3

Alle String-Funktionen arbeiten auf Indizes, einige Funktionen (wie replace() und insert()) nur zusätzlich Unterstützung Iteratoren. So kann das Ergebnis find() direkt in diesen Funktionen verwendet werden. Da es keine zwei find()-Funktionen geben kann, die sich nur durch den Rückgabetyp unterscheiden (wobei einer einen Iterator, der andere einen Index zurückgibt), musste einer ausgewählt werden.