2010-11-15 15 views
6

¿Cuál es el resultado de la función std :: wstring.length(), la longitud en wchar_t (s) o la longitud en símbolos? ¿Y por qué?std :: wstring length

TCHAR r2[3]; 
r2[0] = 0xD834; // D834, DD1E - musical G clef 
r2[1] = 0xDD1E; // 
r2[2] = 0x0000; // '/0' 

std::wstring r = r2; 

std::cout << "capacity: " << r.capacity() << std::endl; 
std::cout << "length: " << r.length() << std::endl; 
std::cout << "size: "  << r.size()  << std::endl; 
std::cout << "max_size: " << r.max_size() << std::endl; 

Output> 

capacity: 351 
length: 2 
size: 2 
max_size: 2147483646 

Respuesta

11

std::wstring::size() devuelve el número de elementos anchos de la cadena. Esto no es lo mismo que el número de caracteres (como notó correctamente).

Desafortunadamente, la plantilla std::basic_string (y por lo tanto sus instancias, como std::string y std::wstring) está encoding-agnostic. En este sentido, en realidad es solo una plantilla para una cadena de bytes y no una cadena de caracteres.

0

método tamaño devuelve el número actual de elementos en la cadena. Es lo mismo que wstring :: length Las personas generalmente hablan de una palabra, una oración o un párrafo de longitud, no su tamaño

+0

tamaño y longitud son sinónimos –

+0

tamaño_type string :: capacity() const Devuelve el número de caracteres que una cadena puede contener sin reasignarlos. –

0

length() y size() normalmente devolverá el número de "personajes" (independientemente de ancho) en la cadena de excluyendo el null, aquí el tamaño de la longitud & es 2. capacity() vuelve la cantidad de memoria (es decir: el número de caracteres, como esto es multibyte) normalmente está disponible antes de que la cadena se reasigne.

1

Firstly std :: wstring es una instanciación de std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >.

Aunque la mayor parte del trabajo real es realizado por char_traits, y uno puede escribir el suyo, esto se hace principalmente para permitir el uso de la biblioteca C runtime con diferentes tamaños de caracteres.

La manera de analizar en un puntero de Element * es hasta que se llegue al carácter indicado por los char_traits como terminator.

Sin embargo, puede construir con un puntero y una longitud, en cuyo caso leerá el número de caracteres que le indica, que incluirá cualquier nulo-bytes. Puede haber incrustado null-bytes en una cadena básica, y si llama a length() o size() que son alias para la misma cosa, le dirá cuántos caracteres contiene.

No hay ninguna magia en char_traits para decodificar caracteres de elementos múltiples como uno, ni debe intentar implementarlo de esa manera.

+0

y por qué exactamente esta respuesta fue marcada? Proporcioné información útil sobre qué es exactamente una wstring y cómo se construye a partir de un puntero. – CashCow

Cuestiones relacionadas