Как работает str.length () для вычисления длины строки ()? - PullRequest
0 голосов
/ 01 апреля 2020

Предположим, я изначально создаю строку размером n.

Могу ли я изменить ее length() любым способом? (поскольку это просто массив символов, поэтому n должен быть верхним пределом строки). Есть ли способ уменьшить str.length() результат?

Если так, то как str.length() вычисляет длину ? Если он вычисляется путем нахождения '\0', то если я изменю любой символ между * на 1011 *, можно ли уменьшить n?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Если вы ссылаетесь на std::string, как описано здесь (определение: std::basic_string<char>):

Если так, то как работает str.length () рассчитать длину? Если он вычисляется путем нахождения '\ 0', то, если я изменю любой символ между ними на '\ 0', можно ли уменьшить n?

Стандарт C ++ не предписывает детали реализации std::string, только это поведение / интерфейс, но я думаю, что все реализации, как правило, выглядят следующим образом:

У вас есть класс, содержащий указатель на соответствующую память, необходимую для вашей строки, и 2 целых числа. Целые числа хранят фактическую длину вашей строки и размер выделенной памяти. Поэтому, когда вы звоните str.length(), он просто ищет сохраненный номер в постоянном времени. Так что нет расчета. Поэтому вы также не можете изменить его размер, вставив \0. Фактически, сохраняя размер явно, вам совсем не нужен \0.

Могу ли я изменить его length () любым методом? Есть ли способ уменьшить результат str.length ()?

Существует специальный метод c resize. Однако вы также можете использовать несколько других методов для изменения его длины, например, insert, append, clear и некоторые другие. Просто посмотрите на связанную документацию. Сам класс заботится о распределении памяти для хранения результата этих операций. Вы также можете получить размер основной памяти с помощью метода capacity. Если вы примените некоторые операции к вашей строке, вы заметите, что значение, возвращаемое capacity, может быть равно length, но оно также может быть и выше. Если вы уменьшите длину вашей строки, большинство реализаций не будет перераспределять основную память.

0 голосов
/ 01 апреля 2020

Для вопроса 1 я не уверен, что именно вы спрашиваете, но это зависит от реализации. Есть много видов string. Что касается '\0', длину строки можно получить, посчитав букву, пока она не встретит '\0'. Помещение этого нулевого символа в более раннюю позицию уменьшит str.length(), но это не очень рекомендуется.

Для вопроса 2 да, это правда. Более того, если вы удалите '\0', строка не сможет функционировать как строка. Вот почему нам нужно еще один пробел для хранения строки, чем исходная длина, для хранения нулевого символа.

...