Fonctions membres std :: string length () et size ()

265

J'ai lu les réponses à cette question et a trouvé qu'il ya effectivement une méthode appelée length()pour std::string(j'ai toujours utilisé size()). Y a-t-il une raison spécifique pour avoir cette méthode en std::stringclasse? J'ai lu à la fois MSDN et CppRefernce, et ils semblent indiquer qu'il n'y a aucune différence entre size()et length(). Si tel est le cas, n'est-ce pas source de confusion pour l'utilisateur de la classe?

Naveen
la source

Réponses:

342

Selon la documentation , ce ne sont que des synonymes. size()est là pour être compatible avec d' autres conteneurs STL (comme vector, map, etc. ) et length()doit être compatible avec la notion intuitive de la plupart des peuples de chaînes de caractères. Les gens parlent généralement de la longueur d' un mot, d'une phrase ou d'un paragraphe , et non de sa taille, il length()est donc là pour rendre les choses plus lisibles.

Todd Gamblin
la source
9
D'accord. Lorsque j'écris des classes et des fonctions de modèle, je préfère utiliser size()(au cas où j'utiliserais des classes non-chaîne), mais la plupart du temps j'utilise length()lorsque je travaille avec des chaînes simples.
Marius
3
Size () ne renvoie-t-il pas la taille de la chaîne dans la mémoire (en octets), tandis que length () renvoie le nombre de caractères, qui se trouvent juste coïncider, puisque 1 char = 1 octet?
Boyan Kushlev
4
Non. Ils ont la même fonction; ils partagent même la documentation: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin
4
Ils sont tous deux définis comme équivalents à distance (s.begin (), s.end ()), où begin () et end () sont des itérateurs sur les éléments CharT. CharT est un paramètre de modèle qui détermine le contenu de la chaîne. Pour std :: string, CharT est char. Pour std :: wstring, CharT est wchar_t, qui est généralement de 2 ou 4 octets. Même là, length () et size () renverront le nombre de caractères dans la chaîne, PAS le nombre d'octets.
Todd Gamblin
5
Vous devez oublier que parfois les gens utilisent std :: string pour stocker la chaîne UTF8 . et utf8 est un codage de longueur variable , vous ne pouvez donc pas utiliser la longueur () ou la taille () pour obtenir le nombre de caractères de la chaîne. En fait, ils retournent juste le compte de l'élément:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian
16

Ruby est tout de même, btw, offrant les deux #length et #size comme synonymes pour le nombre d'éléments dans les tableaux et les hachages (C ++ ne le fait que pour les chaînes).

Les minimalistes et les gens qui croient "qu'il devrait y en avoir un, et idéalement un seul moyen évident de le faire" (comme le récite le Zen de Python), je suppose, seront principalement d'accord avec vos doutes, @Naveen, tandis que les fans de Perl's " Il y a plus d'une façon de le faire "(ou la syntaxe SQL avec un bazillion de" mots de bruit "optionnels donnant énormément de formes syntaxiques identiques pour exprimer un concept) se plaindra sans doute que Ruby, et en particulier C ++, ne va pas loin assez pour offrir une telle redondance synonymique ;-).

Alex Martelli
la source
9
Dans ce cas, c'est gratuit. La grammaire et l'utilisation de Perl vous permettent d'exprimer les choses en utilisant le style que vous préférez. Avoir deux mots différents pour la même chose rend difficile la recherche de termes de recherche dans Stackoverflow.
Adrian Ratnapala
0

Lors de l'utilisation d'outils de codage (LeetCode), il semble que size () soit plus rapide que length () (bien que fondamentalement négligeable)

Morten
la source
-10

longueur de la chaîne == combien de bits cette chaîne a, taille == taille de ces bits, dans les chaînes les deux sont les mêmes si l'éditeur alloue la taille du caractère est de 1 octet

user7817690
la source
7
réponse incorrecte. Voir la documentation liée dans la réponse acceptée.
Stefan de Kok