Funciones miembro std :: string length () y size ()

265

Estaba leyendo las respuestas para esta pregunta y encontré que en realidad hay un método llamado length()de std::string(Siempre he utilizado size()). ¿Hay alguna razón específica para tener este método en std::stringclase? Leí MSDN y CppRefernce, y parecen indicar que no hay diferencia entre size()y length(). Si es así, ¿no es más confuso para el usuario de la clase?

Naveen
fuente

Respuestas:

342

Según la documentación , estos son solo sinónimos. size()está ahí para ser consistente con otros contenedores STL (como vector, map, etc. ) y length()es ser coherente con la noción intuitiva la mayoría de los pueblos de cadenas de caracteres. La gente generalmente habla sobre la longitud de una palabra, oración o párrafo , no sobre su tamaño, por lo que length()está ahí para hacer que las cosas sean más legibles.

Todd Gamblin
fuente
9
Convenido. Cuando escribo clases y funciones de plantilla prefiero usar size()(en caso de que alguna vez use clases que no sean cadenas), pero la mayoría de las veces las uso length()cuando trabajo con cadenas simples.
Marius
3
¿Size () no devuelve el tamaño de la cadena en la memoria (en bytes), mientras que length () devuelve el número de caracteres que coinciden, ya que 1 char = 1 byte?
Boyan Kushlev
44
No. Son la misma función; incluso comparten documentación: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin
44
Ambos se definen como equivalentes a la distancia (s.begin (), s.end ()), donde begin () y end () son iteradores sobre los elementos CharT. CharT es un parámetro de plantilla que determina qué hay en la cadena. Para std :: string, CharT es char. Para std :: wstring, CharT es wchar_t, que suele tener 2 o 4 bytes. Incluso allí, longitud () y tamaño () devolverán el número de caracteres en la cadena, NO el número de bytes.
Todd Gamblin
55
Debe olvidar que a veces las personas usarán std :: string para almacenar la cadena UTF8 . y la cadena utf8 es una codificación de longitud variable , entonces no puede usar la longitud () o el tamaño () para obtener el recuento del carácter de la cadena. En realidad, solo devuelven el recuento del elemento:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian
16

Ruby es lo mismo, por cierto, ofreciendo ambos #length y #size como sinónimos para la cantidad de elementos en matrices y hashes (C ++ solo lo hace para cadenas).

Los minimalistas y las personas que creen que "debería haber uno, e idealmente solo una forma obvia de hacerlo" (como recita el Zen de Python), supongo, estarán de acuerdo con sus dudas, @Naveen, mientras que los fanáticos de Perl " Hay más de una forma de hacerlo "(o la sintaxis de SQL con un bazillion de" palabras de ruido "opcionales que dan innumerables formas sintácticas idénticamente equivalentes para expresar un concepto) sin duda se quejarán de que Ruby, y especialmente C ++, no van muy lejos suficiente para ofrecer tal redundancia sinónimo ;-).

Alex Martelli
fuente
9
En este caso es gratuito. La gramática y el uso de Perl le permiten expresar cosas usando el estilo que prefiera. Tener dos palabras diferentes para lo mismo simplemente hace que sea difícil encontrar términos de búsqueda en Stackoverflow.
Adrian Ratnapala
0

Cuando se usan herramientas de práctica de codificación (LeetCode) parece que size () es más rápido que length () (aunque básicamente insignificante)

Morten
fuente
-10

longitud de cadena == cuántos bits tiene esa cadena, tamaño == tamaño de esos bits, en cadenas ambas son iguales si el editor asigna un tamaño de carácter de 1 byte

usuario7817690
fuente
77
respuesta incorrecta. Consulte la documentación vinculada en la respuesta aceptada.
Stefan de Kok