funkcje składowe std :: string length () i size ()

263

Byłem przeczytaniu odpowiedzi na to pytanie i okazało się, że nie jest w rzeczywistości metoda zwana length()dla std::string(I zawsze używany size()). Czy jest jakiś konkretny powód, aby mieć tę metodę w std::stringklasie? Czytam zarówno MSDN, jak i CppRefernce, i wydają się one wskazywać, że nie ma różnicy między size()i length(). Jeśli tak, to czy nie czyni to bardziej skomplikowanym dla użytkownika klasy?

Naveen
źródło

Odpowiedzi:

340

Zgodnie z dokumentacją są to tylko synonimy. size()jest tam, aby być spójne z innymi kontenerów STL (jak vector, map, itd. ) i length()ma być spójna z większości narodów intuicyjnym pojęciem ciągów znaków. Ludzie zwykle mówią o słowa, zdania lub akapitu długości , a nie jego rozmiar, tak length()jest tam, aby uczynić to bardziej czytelne.

Todd Gamblin
źródło
9
Zgoda. Kiedy piszę klasy szablonów i funkcje, wolałbym ich używać size()(na wypadek, gdyby kiedykolwiek korzystałem z klas nieciągłych), ale większość czasu używam length()przy pracy z prostymi łańcuchami.
Marius
3
Czy size () nie zwraca wielkości ciągu w pamięci (w bajtach), podczas gdy length () zwraca liczbę znaków, które przypadkowo się pokrywają, ponieważ 1 znak = 1 bajt?
Boyan Kushlev
4
Nie. Są to ta sama funkcja; udostępniają nawet dokumentację: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin
4
Oba są zdefiniowane jako równoważne odległości (s.begin (), s.end ()), gdzie begin () i end () są iteratorami elementów CharT. CharT to parametr szablonu, który określa, co znajduje się w ciągu. Dla std :: string CharT jest char. Dla std :: wstring, CharT to wchar_t, który zwykle ma 2 lub 4 bajty. Nawet tam zarówno length (), jak i size () zwrócą liczbę znaków w łańcuchu, a NIE liczbę bajtów.
Todd Gamblin
5
Musisz czasem zapomnieć, że ludzie będą używać std :: string do przechowywania łańcucha UTF8 . a ciąg utf8 jest kodowaniem o zmiennej długości , więc nie można użyć length () ani size (), aby uzyskać liczbę znaków ciągu. W rzeczywistości zwracają liczbę elementów:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian
16

Ruby jest taki sam, btw, oferując oba #length i #size jako synonimy dla liczby elementów w tablicach i skrótach (C ++ robi to tylko dla łańcuchów).

Minimaliści i ludzie, którzy wierzą, że „powinien być jeden, a najlepiej tylko jeden, oczywisty sposób na zrobienie tego” (jak mówi Zen Pythona), zgaduję, w większości, zgodzą się z twoimi wątpliwościami, @Naveen, podczas gdy fani Perla są ” Jest więcej niż jeden sposób, aby to zrobić ”(lub składnia SQL z opcjonalnym bazillionem„ szumowymi słowami ”zapewniającymi wiele identycznie równoważnych form składniowych do wyrażenia jednej koncepcji) bez wątpienia będzie narzekać, że Ruby, a zwłaszcza C ++, po prostu nie posuwaj się daleko wystarczy zaoferować taką synonimiczną redundancję ;-).

Alex Martelli
źródło
9
W tym przypadku jest to bezpłatne. Gramatyka i użycie Perla pozwalają wyrażać rzeczy w dowolnym stylu. Posiadanie dwóch różnych słów na to samo po prostu utrudnia wymyślenie wyszukiwanych haseł w Stackoverflow.
Adrian Ratnapala
0

Podczas korzystania z narzędzi do programowania (LeetCode) wydaje się, że size () jest szybszy niż length () (choć w zasadzie nieistotny)

Morten
źródło
-10

długość ciągu == ile bitów ma ten ciąg, rozmiar == rozmiar tych bitów, w ciągach oba są takie same, jeśli redaktor przydzieli rozmiar znaku 1 bajt

użytkownik7817690
źródło
7
niepoprawna odpowiedź. Zobacz dokumentację połączoną z zaakceptowaną odpowiedzią.
Stefan de Kok