функции-члены 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 () (хотя в основном незначительный)

Morten
источник
-10

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

user7817690
источник
7
неправильный ответ. См. Документацию, связанную в принятом ответе.
Стефан де Кок