Funções de membro std :: string length () e size ()

265

Eu estava lendo as respostas para esta questão e descobriram que há realmente um método chamado length()para std::string(eu sempre usado size()). Existe algum motivo específico para ter esse método na std::stringaula? Eu li o MSDN e o CppRefernce, e eles parecem indicar que não há diferença entre size()e length(). Se é assim, não está tornando mais confuso para o usuário da classe?

Naveen
fonte

Respostas:

342

De acordo com a documentação , estes são apenas sinônimos. size()está lá para ser compatível com outros contêineres STL (como vector, map, etc. ) e length()deve ser consistente com a noção intuitiva da maioria das pessoas de cadeias de caracteres. As pessoas costumam falar sobre o comprimento de uma palavra, frase ou parágrafo , e não o seu tamanho, então length()existe para tornar as coisas mais legíveis.

Todd Gamblin
fonte
9
Acordado. Quando escrevo classes e funções de modelo, prefiro usar size()(no caso de usar classes não-string), mas na maioria das vezes uso length()quando trabalho com strings simples.
Marius
3
Size () não retorna o tamanho da string na memória (em bytes), enquanto length () retorna o número de caracteres, que coincidem por acaso, já que 1 char = 1 byte?
Boyan Kushlev 30/01
4
Não. Eles têm a mesma função; eles até compartilham a documentação: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin 31/01
4
Ambos são definidos para serem equivalentes a distance (s.begin (), s.end ()), onde begin () e end () são iteradores sobre os elementos CharT. CharT é um parâmetro de modelo que determina o que está na string. Para std :: string, CharT é char. Para std :: wstring, CharT é wchar_t, que geralmente é de 2 ou 4 bytes. Mesmo lá, length () e size () retornarão o número de caracteres na string, NÃO o número de bytes.
Todd Gamblin 31/01
5
Você deve esquecer que às vezes as pessoas usam std :: string para armazenar a string UTF8 . e utf8 string é uma codificação de tamanho variável , então você não pode usar length () ou size () para obter a contagem do caractere de string. Na verdade, eles apenas retornam a contagem do elemento:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian
16

O Ruby é o mesmo, btw, oferecendo ambos #length e #size como sinônimos para o número de itens em matrizes e hashes (o C ++ apenas faz isso para strings).

Minimalistas e pessoas que acreditam que "deve haver um e, idealmente, apenas um modo óbvio de fazê-lo" (como recita o Zen of Python), eu acho, concordam principalmente com suas dúvidas, @Naveen, enquanto fãs de Perl " Há mais de uma maneira de fazê-lo "(ou a sintaxe do SQL com um bazilhão de" palavras de ruído "opcionais que fornecem várias formas sintáticas idênticas equivalentes para expressar um conceito) sem dúvida estará reclamando que Ruby, e especialmente C ++, simplesmente não vai longe suficiente para oferecer essa redundância sinonímica ;-).

Alex Martelli
fonte
9
Nesse caso, é gratuito. A gramática e o uso de Perl permitem que você expresse as coisas usando o estilo que você preferir. Ter duas palavras diferentes para a mesma coisa apenas dificulta a criação de termos de pesquisa no Stackoverflow.
Adrian Ratnapala
0

Ao usar ferramentas práticas de codificação (LeetCode), parece que size () é mais rápido que length () (embora basicamente insignificante)

Morten
fonte
-10

comprimento da string == quantos bits essa string possui, tamanho == tamanho desses bits, Em strings, ambos são iguais se o editor alocar tamanho de caractere for 1 byte

user7817690
fonte
7
resposta incorreta. Consulte a documentação vinculada na resposta aceita.
Stefan de Kok