Ist std::string size() O(1) operation?
Ist std::string size() O(1) operation?
Die Durchführung der STL, die ich verwende, ist das man sich in VC++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist std::string size() O(1) operation?
Die Durchführung der STL, die ich verwende, ist das man sich in VC++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Fragen, wenn MSVC Implementierung string::size() hat Konstante Komplexität, dann ist die Antwort ja. Aber Don Wakefield genannten Tabelle 65 23.1 der C++ - Standard, wo es heißt, dass die Komplexität der
size()
Folgen sollte, was gesagt wird in "Note Ein". Hinweis: Eine sagt:Jedoch, das bedeutet nicht, dass die Einträge wird haben Konstante Komplexität. Standards verwenden eine ganz spezifische Terminologie, und "sollte" bedeutet, dass es ist nicht zwingend erforderlich.
'Ein Hinweis' wurde Hinzugefügt, um die standard-speziell zu beschwichtigen diejenigen, die glaubten, dass
size()
sollte erlaubt sein, lineare Komplexität, so würde es nicht notwendig sein, um die Größe, wenn die Container wurden geändert.So können Sie sich nicht darauf verlassen, dass
size()
mit konstanter Komplexität, aber ich bin ehrlich gesagt nicht sicher, ob es irgendwelche Implementierungen, die nicht über eine Konstantestring::size()
.(end() - begin())
. Das wird garantiert [abgeschrieben] O(1), da beidebegin()
undend()
werden muss, O(1) (Container), string-Iteratoren sind random-access (string-Anforderungen), undoperator-
werden muss, O(1) für Iteratoren, die es unterstützen (iterator-Anforderungen).O(1)
ist nicht eine Anforderung für alle - Container, bedeutet nicht, dass es sein kannO(N)
im Container, nur, dass es mindestens einen container, für die ist es nicht-Konstanten, zum Beispielstd::list<>
.std::string
Anforderungen verbieten dies jedoch (z.B. dies scheint zu implizieren array subscripting nicht mehr O(1)).std::basic_string<>::size()
es bezieht sich auf die Anforderungen für container (d.h. empfohlen Konstante Größe), in die 11 standard-die Anforderung ist eindeutig: Komplexität: Konstante Zeit.basic_string
entspricht den Anforderungen einer Sequenz, wie in (23.1.1)", und eine Sequenz ist eine Art container (23.1.1/1), und ein container-Mandate Konstante-timebegin()
undend()
(Tabelle 65 23.1) Froh zu hören, Sie machten es ausdrücklich in C++11.Hier ist eine einfache Möglichkeit, diese Frage zu beantworten, die für msvc++.
Code schreiben, in einem Projekt:
Hilight der .Größe nennen, mit der rechten Maustaste, gehe zu definition.
Auf meinem installieren (vs2005sp1) dieser schickt mich, um xstring:1635, die wie folgt aussieht:
So sieht es aus, wie der string hat ein Mitglied namens _Mysize, und es ist nur das zurück.
In anderen Worten, dies ist eine O(1) Implementierung.
Ja, std::string::size() ist O(1).
Siehe Tabelle 65, die in Abschnitt 23.1 des Standard. "ein.size()" als aufgeführt ist "(Hinweis A)", die sagt, dass "Diese Einträge ... sollte haben Konstante Komplexität".
Abschnitt 21.3 sagt, dass die Saiten sich an die Anforderungen einer Sequenz von (23.1), ipso facto, size() ist die Konstante Zeit.
Für eine Zeichenfolge, die
size()
Betrieb hat konstant für alle string-Implementierungen, die nicht Seile(1). Es gibt keine explizite Anforderung in der standard erfordert, dass der Betrieb zuO(1)
, die nächste ist die generische Anforderung, dasssize()
sollte werden Konstante Zeit, aber das lässt Raum für andere Komplexität zu Messen.Warum also muss es werden O(1)?
Dies kommt von der Tatsache, dass die Größe nicht berechnet werden kann, der vom Inhalt der string selbst. Während in C verwenden Sie ein NUL-terminator, um festzustellen, die Ende der Zeichenkette, in C++ ist NULL, ist genauso gültig, wie alle anderen Zeichen in der Zeichenfolge. Da die Größe der Zeichenfolge können nicht berechnet werden, aus dem Inhalt(2), es muss nicht extern verwaltet werden, unabhängig von der tatsächlichen Größe der Zeichenfolge.
(1) C++03-standard erlaubt es, eine Implementierung zu verwenden Seile wie die implementation für strings, aber die Tatsache ist, dass keiner der aktuellen Implementierungen von standard-Bibliotheken verwenden.
(2) Wenn die Implementierung von Seilen, die Bedienung könnte abhängig von der Größe durch die Anzahl der Blöcke, aus denen das Seil aufgebaut wurde, wenn die Blöcke sind verbunden durch eine verknüpfte Liste oder ähnliches bauen, oder wenn Sie zugelassen wurden, unterschiedliche Größen haben. Aber Seile sind nicht in irgendeiner standard-Bibliothek-Implementierung, die ich kenne.
Performance ist garantiert durch die STL mindestens O(N) für Behälter, wie viele Container mit std::string implementieren können, dies als O(1) und wird. In der Regel werde es wieder eine einfache variable oder etwas tun, wie _End - _Begin und zurückgeben.
Also ist es möglicherweise so sein, aber man kann nie sicher sein.