funzioni membro std :: string length () e size ()


265

Stavo leggendo le risposte per questa domanda e ha scoperto che v'è in realtà un metodo chiamato length()per std::string(ho sempre usato size()). C'è un motivo specifico per avere questo metodo in std::stringclasse? Ho letto sia MSDN che CppRefernce e sembrano indicare che non c'è differenza tra size()e length(). Se è così, non sta creando più confusione per l'utente della classe?

Risposte:


342

Secondo la documentazione , questi sono solo sinonimi. size()è lì per essere coerente con altri contenitori STL (come vector, map, ecc ) ed length()è quello di essere coerenti con la nozione intuitiva la maggior parte dei popoli di stringhe di caratteri. Le persone di solito parlano di una parola, una frase o la lunghezza di un paragrafo , non delle sue dimensioni, quindi length()è lì per rendere le cose più leggibili.


9
Concordato. Quando scrivo le classi e le funzioni del modello, preferirei usare size()(nel caso in cui io usi mai classi non stringa), ma il più delle volte lo uso length()quando lavoro con stringhe semplici.
Marius,

3
Size () non restituisce la dimensione della stringa in memoria (in byte), mentre length () restituisce il numero di caratteri, che coincidono, dato che 1 carattere = 1 byte?
Boyan Kushlev,

4
No. Hanno la stessa funzione; condividono persino la documentazione: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin,

4
Entrambi sono definiti come equivalenti a distance (s.begin (), s.end ()), dove begin () e end () sono iteratori su elementi CharT. CharT è un parametro modello che determina cosa c'è nella stringa. Per std :: string, CharT è char. Per std :: wstring, CharT è wchar_t, che in genere è 2 o 4 byte. Anche lì, sia length () che size () restituiranno il numero di caratteri nella stringa, NON il numero di byte.
Todd Gamblin,

5
Devi dimenticare che a volte le persone useranno std :: string per memorizzare la stringa UTF8 . e utf8 stringa è una codifica a lunghezza variabile , quindi non è possibile utilizzare length () o size () per ottenere il conteggio del carattere stringa. In realtà restituiscono solo il conteggio dell'elemento:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian

16

Rubino è la stessa cosa, btw, che offre sia #length e #size come sinonimi per il numero di elementi in array e hash (C ++ solo lo fa per le stringhe).

I minimalisti e le persone che credono che "ci dovrebbe essere uno, e idealmente solo un modo ovvio per farlo" (come recita lo Zen di Python), immagino, saranno per lo più d'accordo con i tuoi dubbi, @Naveen, mentre i fan di Perl " C'è più di un modo per farlo "(o la sintassi di SQL con un bazillion di" parole di rumore "opzionali che danno a ennesime forme sintattiche identicamente equivalenti per esprimere un concetto) senza dubbio si lamenterà che Ruby, e in particolare C ++, non vanno molto lontano abbastanza nell'offrire tale ridondanza sinonimo ;-).


9
In questo caso è gratuito. La grammatica e l'utilizzo di Perl ti consentono di esprimere le cose usando lo stile che preferisci. Avere due parole diverse per la stessa cosa rende semplicemente difficile trovare termini di ricerca in StackOverflow.
Adrian Ratnapala,

0

Quando si usano gli strumenti di pratica di codifica (LeetCode) sembra che size () sia più veloce di length () (anche se sostanzialmente trascurabile)


-10

lunghezza della stringa == quanti bit ha quella stringa, size == dimensione di quei bit, nelle stringhe entrambe sono uguali se l'editor assegna la dimensione del carattere è 1 byte


7
Risposta sbagliata. Vedi la documentazione collegata nella risposta accettata.
Stefan de Kok,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.