std :: довжина рядка () та розмір () функції члена


263

Я читав відповіді на цей питання і виявив , що насправді метод називається length()для std::string(я завжди використовував size()). Чи є якась конкретна причина для використання цього методу в std::stringкласі? Я читаю і MSDN, і CppRefernce, і вони, схоже, вказують на відсутність різниці між size()і length(). Якщо це так, чи не робить це більш заплутаним для користувача класу?

Відповіді:


340

Згідно з документацією , це лише синоніми. size()знаходиться там , щоб бути в відповідності з іншими контейнерами STL (як vector, map, і т.д. ) і length()має бути в відповідності з інтуїтивним поняттям більшості народів символьних рядків. Зазвичай люди говорять про довжину слова, речення або абзацу , а не про його розмір, тому length()є для того, щоб зробити речі більш зрозумілими.


9
Домовились. Коли я пишу шаблонні класи та функції, я вважаю за краще size()(якщо я коли-небудь використовую не струнні класи), але більшу частину часу використовую length()під час роботи з простими рядками.
Маріус

3
Чи не повертає розмір () розмір рядка в пам'яті (в байтах), тоді як довжина () повертає кількість символів, які просто збігаються, оскільки 1 char = 1 байт?
Боян Кушльов

4
Ні. Вони однакові за функцією; вони навіть діляться документацією: en.cppreference.com/w/cpp/string/basic_string/size .
Тодд Гамблін

4
Вони обидва визначені як еквівалентні відстані (s.begin (), s.end ()), де begin () і end () є ітераторами над елементами CharT. CharT - параметр шаблону, який визначає, що є в рядку. Для std :: string, CharT - це char. Для std :: wstring, CharT - це wchar_t, що зазвичай становить 2 або 4 байти. Навіть там і довжина (), і розмір () повернуть кількість символів у рядку, а не кількість байтів.
Тодд Гамблін

5
Ви повинні забути, що іноді люди використовуватимуть std :: string для зберігання рядка UTF8 . а рядок utf8 - це кодування змінної довжини , тоді ви не можете використовувати length () або size () для отримання підрахунку символу рядка. Насправді вони просто повертають кількість елементів:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian

16

Ruby - це саме те саме, btw, що пропонує #length і #size синоніми для кількості елементів у масивах і хешах (C ++ робить це лише для рядків).

Мінімалісти та люди, які вважають, що "мав би бути один, і в ідеалі лише один, очевидний спосіб зробити це" (як декламує Дзен Пітона), я думаю, в основному згоден з вашими сумнівами, @Naveen, тоді як шанувальники Перла " Існує більше одного способу зробити це "(або синтаксис SQL з базовим мільйоном необов'язкових" шумових слів ", що дає незрозуміло однакові синтаксичні форми для вираження одного поняття), без сумніву, буде скаржитися, що Рубі, і особливо C ++, просто не заходить далеко досить запропонувати таку синонімічну надмірність ;-).


9
У цьому випадку це безоплатно. Граматика та використання Perl дозволяють висловлювати речі за допомогою будь-якого стилю. Якщо мати два різних слова для однієї і тієї ж речі, це просто ускладнює пошук пошукових термінів у Stackoverflow.
Адріан Ратнапала

0

При використанні засобів практичного кодування (LeetCode) здається, що розмір () швидше, ніж довжина () (хоча в основному незначний)


-10

довжина рядка == скільки бітів у цій рядку, розмір == розмір цих бітів, У рядках обидва однакові, якщо редактор виділяє розмір символу 1 байт


7
неправильна відповідь. Дивіться документацію, пов’язану у прийнятій відповіді.
Штефан де Кок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.