Mitgliedsfunktionen std :: string length () und size ()


263

Ich war es, die Antworten für diese Lesung Frage und fand , dass es tatsächlich eine Methode aufgerufen ist length()für std::string(I immer verwendet size()). Gibt es einen bestimmten Grund, diese Methode im std::stringUnterricht zu haben? Ich habe sowohl MSDN als auch CppRefernce gelesen und sie scheinen darauf hinzudeuten, dass es keinen Unterschied zwischen size()und gibt length(). Wenn dem so ist, macht es den Benutzer der Klasse nicht verwirrender?

Antworten:


339

Laut Dokumentation sind dies nur Synonyme. size()wird mit anderen STL - Container (wie konsistent sein vector, map, usw. ) und length()ist im Einklang mit den meisten Völkern intuitive Vorstellung von Zeichenketten. Die Leute sprechen normalerweise über die Länge eines Wortes, eines Satzes oder eines Absatzes , nicht über seine Größe, length()um die Lesbarkeit zu verbessern.


9
Einverstanden. Wenn ich Vorlagenklassen und -funktionen schreibe, verwende ich lieber size()(falls ich jemals Nicht-String-Klassen verwende), aber die meiste Zeit verwende ich, length()wenn ich mit einfachen Strings arbeite.
Marius

3
Gibt size () nicht die Größe der Zeichenfolge im Speicher (in Bytes) zurück, während length () die Anzahl der Zeichen zurückgibt, die zufällig zusammenfallen, da 1 Zeichen = 1 Byte ist?
Boyan Kushlev

4
Nein, sie haben die gleiche Funktion. Sie teilen sogar die Dokumentation: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin

4
Sie sind beide so definiert, dass sie der Entfernung entsprechen (s.begin (), s.end ()), wobei begin () und end () Iteratoren über CharT-Elemente sind. CharT ist ein Vorlagenparameter, der bestimmt, was in der Zeichenfolge enthalten ist. Für std :: string ist CharT char. Für std :: wstring ist CharT wchar_t, was normalerweise 2 oder 4 Bytes entspricht. Selbst dort geben sowohl length () als auch size () die Anzahl der Zeichen in der Zeichenfolge zurück, NICHT die Anzahl der Bytes.
Todd Gamblin

5
Sie müssen vergessen, dass manchmal Leute std :: string verwenden, um den UTF8- String zu speichern . und utf8 string ist eine Codierung mit variabler Länge . Dann können Sie nicht length () oder size () verwenden, um die Anzahl der Zeichenfolgen zu ermitteln. Eigentlich geben sie nur die Anzahl der Elemente zurück:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian

16

Ruby ist übrigens genau das Gleiche und bietet sowohl #length als auch #size als Synonyme für die Anzahl der Elemente in Arrays und Hashes (C ++ tut dies nur für Zeichenfolgen).

Minimalisten und Leute, die glauben, "es sollte einen und im Idealfall nur einen offensichtlichen Weg geben, dies zu tun" (wie das Zen von Python sagt), werden, glaube ich, Ihren Zweifeln größtenteils zustimmen, @Naveen, während Fans von Perl " Es gibt mehr als einen Weg, dies zu tun "(oder die SQL-Syntax mit einer Unmenge optionaler" Rauschwörter ", die unzählige identische äquivalente syntaktische Formen geben, um ein Konzept auszudrücken), wird sich zweifellos darüber beklagen, dass Ruby und insbesondere C ++ einfach nicht weit gehen genug, um eine solche synonymische Redundanz anzubieten ;-).


9
In diesem Fall ist es unentgeltlich. Mit Perls Grammatik und Verwendung können Sie Dinge mit dem von Ihnen bevorzugten Stil ausdrücken. Wenn Sie zwei verschiedene Wörter für dieselbe Sache haben, ist es lediglich schwierig, Suchbegriffe in Stackoverflow zu finden.
Adrian Ratnapala

0

Bei der Verwendung von Codierungsübungswerkzeugen (LeetCode) scheint size () schneller als length () zu sein (obwohl dies im Grunde genommen vernachlässigbar ist).


-10

Länge der Zeichenfolge == wie viele Bits diese Zeichenfolge hat, Größe == Größe dieser Bits. In Zeichenfolgen sind beide gleich, wenn der Editor die Zeichengröße 1 Byte zuweist


7
falsche Antwort. Siehe Dokumentation in der akzeptierten Antwort.
Stefan de Kok
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.