2010-11-15 5 views
6

Quel est le résultat de la fonction std :: wstring.length(), la longueur de wchar_t (s) ou la longueur en symboles? Et pourquoi?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 

Répondre

11

std::wstring::size() retourne le nombre d'éléments de caractères larges dans la chaîne. Ce n'est pas la même chose que le nombre de caractères (comme vous l'avez remarqué correctement).

Malheureusement, le modèle std::basic_string (et donc ses instanciations, telles que std::string et std::wstring) est indépendant du codage. En ce sens, il s'agit simplement d'un modèle pour une chaîne d'octets et non d'une chaîne de caractères.

0

La méthode size renvoie le nombre actuel d'éléments dans la chaîne. C'est la même chose que wstring :: length Les gens parlent habituellement d'un mot, d'une phrase ou d'une longueur de paragraphe, et non de sa taille

+0

taille et longueur sont des synonymes –

+0

size_type string :: capacity() const Renvoie le nombre de caractères qu'une chaîne peut contenir sans réaffectation. –

0

length() et size() reviennent généralement le nombre de « caractères » (quelle que soit la largeur) dans la chaîne hors la null, ici la taille longueur & est 2. capacity() rendement la quantité de mémoire (lire: combien de caractères, comme c'est multi-octets) est généralement disponible avant que la chaîne ne soit réaffectée.

1

Tout d'abord, std :: wstring est une instanciation de std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >.

Bien que la plupart du travail réel soit effectué par char_traits, et que l'on puisse écrire le leur, cela est principalement fait pour permettre l'utilisation de la bibliothèque d'exécution C avec différentes tailles de caractères.

La manière d'analyser un pointeur d'élément * est jusqu'à ce que le caractère indiqué par le caractère char_traits comme terminateur soit atteint.

Cependant, vous pouvez construire avec un pointeur et une longueur, auquel cas il lira le nombre de caractères qu'il vous indiquera, qui inclura n'importe quel octet nul. Vous pouvez avoir incorporé des octets null dans une chaîne_base, et si vous appelez length() ou size() qui sont des alias pour la même chose, il vous dira combien de caractères il contient. Il n'y a pas de magie dans char_traits pour décoder les caractères multi-éléments en un seul, et vous ne devriez pas essayer de l'implémenter de cette façon.

+0

et pourquoi exactement cette réponse a-t-elle été annulée? J'ai donné des informations utiles sur exactement ce qu'est un wstring et comment il se construit à partir d'un pointeur. – CashCow

Questions connexes