функции-члены std :: string length () и size ()


265

Я читал ответы на этот вопрос и обнаружил, что на самом деле есть метод, называемыйlength() для std::string(я всегда использовал size()). Есть ли какая-то конкретная причина для использования этого метода в std::stringклассе? Я прочитал и MSDN и CppRefernce, и они, кажется, указывают, что нет никакой разницы между size()и length(). Если это так, разве это не запутывает пользователя класса?

Ответы:


342

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


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

3
Разве size () не возвращает размер строки в памяти (в байтах), тогда как length () возвращает количество символов, которые просто совпадают, поскольку 1 символ = 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 байта. Даже там, length () и size () будут возвращать количество символов в строке, а НЕ количество байтов.
Тодд Гамблин

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.
Шин Тянь

16

Руби тоже самое, кстати, предлагая #length и #size качестве синонимов для количества элементов в массивах и хешах (C ++ делает это только для строк).

Минималисты и люди, которые считают, что «должен быть один, а в идеале только один, очевидный способ сделать это» (как рассказывает Zen of Python), я думаю, в основном согласятся с вашими сомнениями, @Naveen, в то время как поклонники Perl's » Существует более одного способа сделать это »(или синтаксис SQL с необязательными« шумовыми словами », дающими множество различных идентично эквивалентных синтаксических форм для выражения одной концепции), без сомнения, будет жаловаться, что Ruby, и особенно C ++, просто не идут далеко Достаточно предложить такую ​​синонимическую избыточность ;-).


9
В этом случае это бесплатно. Грамматика и использование Perl позволяют вам выражать вещи, используя любой стиль, который вы предпочитаете. Наличие двух разных слов для одной и той же вещи просто затрудняет поиск поисковых терминов в Stackoverflow.
Адриан Ратнапала

0

При использовании инструментов практики кодирования (LeetCode) кажется, что size () быстрее, чем length () (хотя в основном незначительный)


-10

длина строки == сколько битов в этой строке, размер == размер этих битов, строки одинаковы, если редактор выделяет размер символа 1 байт


7
неправильный ответ. См. Документацию, связанную в принятом ответе.
Стефан де Кок
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.