Wird mit string.Länge() in der Schleife, die leistungsfähig?

Beispielsweise vorausgesetzt, dass eine string s ist diese:

for(int x = 0; x < s.length(); x++)

besser als dieses hier?:

int length = s.length();
for(int x = 0; x < length; x++)

Dank,
Joel

  • Die erste betrifft die Funktionsaufruf-overhead einmal für jede iteration der Schleife, anstatt nur einmal. Soweit ich weiß, die .length() Methode kann führen, in eine nicht-triviale Berechnung (z.B. einer Schleife über den string suchen eine abschließende Charakter), dies ist jedoch extrem unwahrscheinlich, dass auf jeder realen Implementierung, AFAICT.
  • Ich bin mir nicht ganz sicher (wie ich bin nicht vertraut mit der Durchführung der STL-string), aber es scheint mir, dass Sie würde nehmen Sie die gleiche Menge an Zeit, außer int length Kosten würde, Sie sizeof(int) mehr Speicher. Dies ist unter der Annahme, dass s.length() gibt einfach ein integer-Wert, der gespeichert wurde in der Struktur.
  • Ich denke, dass .length ist garantiert zu O(1), da std::string gehorcht der Sequence Anforderungen.
  • Ich fragte diese Frage, weil ich habe auf einigen blog 'nie verwenden, en.Länge() in der bedingten in eine Schleife, weil es die Suche durch die Zeichenfolge zu finden, der NULL-terminator jeder Zeit.' Wollte nur wissen, ob das richtig war.
  • Das wäre der wahre strlen(), aber string.length() können nicht umgesetzt werden in der offensichtlichen Weise mit einem nul-terminator da std::string ermöglicht nul (null) bytes in der Zeichenfolge.
  • Der C++ - standard garantiert nicht, dass .length() ständige Komplexität in den Anforderungen für container (23.1) heißt es: "sollte" statt "soll", die es Spielraum. Ich glaube nicht, dass es in der Praxis irgendwelche mainstream-Implementierungen, die Komplexität schlechter als linear, jedoch.
  • In C++0x n3225 (21.4.4), size() ist garantiert Konstante-Zeit und length() ist definiert als Gibt: size() ohne diese Garantie. Ich weiß nicht, ob Sie meinen, dass es ist nur ein alias, oder, wenn dies erlaubt eine höhere Komplexität :/
  • Ich bezog mich auf die 2003 Version von 1998 mit dem standard. Es ist gut zu wissen, dass dies verschärft in der kommende standard.

InformationsquelleAutor Joel | 2011-02-27
Schreibe einen Kommentar