funcțiile membre std::string length() și size() (Programare, C++, String, Stl, Dimensiune)

Naveen a intrebat.

Citeam răspunsurile la această întrebare și am aflat că există de fapt o metodă numită length() pentru std::string (eu am folosit întotdeauna size()). Există vreun motiv anume pentru a avea această metodă în std::string clasă? Am citit atât MSDN, cât și CppRefernce, și par să indice că nu există nicio diferență între size() și length(). Dacă este așa, nu este mai confuz pentru utilizatorul clasei?

4 răspunsuri
Todd Gamblin

În conformitate cu documentația, , acestea sunt doar sinonime. size() este acolo pentru a fi în concordanță cu alte containere STL (cum ar fi vector, , map, , etc.) și length() este pentru a fi în concordanță cu noțiunea intuitivă de șiruri de caractere a majorității oamenilor. De obicei, oamenii vorbesc despre un cuvânt, o propoziție sau un paragraf lungime, și nu de mărimea acesteia, deci length() este acolo pentru a face lucrurile mai ușor de citit.

utilizator283145

Comentarii

  • De acord. Când scriu clase și funcții de șabloane, prefer să folosesc size() (în cazul în care voi folosi vreodată clase care nu sunt șiruri de caractere), dar de cele mai multe ori folosesc length() atunci când lucrez cu șiruri simple. –  > Por Marius.
  • Size() nu returnează dimensiunea șirului în memorie (în bytes), în timp ce length() returnează numărul de caractere, care întâmplător coincid, din moment ce 1 char = 1 byte? –  > Por Boyan Kushlev.
  • Nu. Ele sunt aceeași funcție; chiar și documentația lor este comună: ro.cppreference.com/w/cpp/string/basic_string/size. –  > Por Todd Gamblin.
  • Ambele sunt definite ca fiind echivalente cu distance(s.begin(), s.end())), unde begin() și end() sunt iteratori peste elementele CharT. CharT este un parametru de șablon care determină ce se află în șir. Pentru std::string, CharT este char. Pentru std::wstring, CharT este wchar_t, care are de obicei 2 sau 4 octeți. Chiar și acolo, atât length(), cât și size() vor returna numărul de caractere din șir, NU numărul de octeți. –  > Por Todd Gamblin.
  • Trebuie să uitați că, uneori, oamenii vor folosi std::string pentru a stoca UTF8 iar șirul UTF8 este codare de lungime variabilă, , atunci nu puteți utiliza length() sau size() pentru a obține numărul de caractere ale șirului. De fapt, acestea returnează doar numărul de elemente: std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t. –  > Por Sheen Tian.
Alex Martelli

Ruby este exact la fel, btw, oferind atât #length și #size ca sinonime pentru numărul de elemente din array-uri și hașuri (C++ o face doar pentru șiruri de caractere).

Minimaliștii și oamenii care cred că „ar trebui să existe o singură cale evidentă de a face lucrurile și, în mod ideal, doar una singură” (așa cum recită Zen of Python) vor fi, cred, în mare parte de acord cu îndoielile tale, @Naveen, în timp ce fanii Perl-ului „Există mai multe moduri de a face acest lucru” (sau ai sintaxei SQL cu un bazilion de „cuvinte de zgomot” opționale care oferă nenumărate forme sintactice identice echivalente pentru a exprima un singur concept) se vor plânge, fără îndoială, că Ruby și, în special, C++ nu merg suficient de departe în a oferi o astfel de redundanță sinonimică; -).

Comentarii

  • În acest caz, este gratuită. Gramatica și utilizarea lui Perl vă permit să exprimați lucrurile folosind orice stil preferați. A avea două cuvinte diferite pentru același lucru nu face decât să îngreuneze căutarea de termeni de căutare în Stackoverflow. –  > Por Adrian Ratnapala.
Morten

Atunci când se utilizează instrumente de practică de codare (LeetCode) se pare că size() este mai rapid decât length() (deși practic neglijabil)

Comentarii

user7817690

lungimea șirului ==câți biți are șirul, mărimea==dimensiunea acelor biți,În șiruri ambele sunt identice dacă editorul alocă dimensiunea caracterului este de 1 octet

Comentarii

  • răspuns incorect. Vezi documentația legată în răspunsul acceptat. –  > Por Stefan de Kok.