Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Практическое применение std::string_view

#cpp


Мне понятно, что  std::string_view  это  строка, имеющая только указатель и длину,
без владения, управления памятью и даже без завершающего нуля — и поэтому она не имеет
функции c_str(). Но не смог разобраться(найти пример), когда он может быть предпочтительней
или удобней  std::string? Если не затруднит, прошу ответить с примером. 
    


Ответы

Ответ 1



Проблема, которую решает std::string_view - это проблема, которая при работе с std::string всплывает практически каждую секунду. Когда речь идет о немодифицирующих операциях над строками, в 9 случаях из 10 нам не нужны функции, работающие со всей строкой. Нам нужны более общие функции: работающие с какой-то подстрокой данного std::string, т.е. с каким-то поддиапазоном символов внутри строки. Для этого, конечно, можно предварительно выделять из std::string интересующую нас подстроку, например вызовом substr, с формированием отдельного объекта типа std::string. И далее уже работать с выделенной подстрокой. Но создание подстроки в виде отдельного объекта std::string - это исключительно неэффективно и расточительно. Вот тут-то и приходит на помощь std::string_view, которая является "виртуальным окном" в существующую строку. Т.е. std::string_view реализует виртуальное выделение подстроки в строке, без дополнительного выделения памяти и копирования данных. Фактически, общее правило таково: в вашей программе почти не должно быть функций с параметром типа const std::string &. Почти все такие функции должны принимать именно const std::string_view & или std::string_view. То есть вся функциональность немодифицирующей обработки строк должна быть реализована именно в терминах std::string_view. А уж привязать это std::string_view вы можете и ко всей строке, и к любой ее подстроке. Это позволяет нам унифицировать константную обработку строк и подстрок без лишних затрат производительности и ресурсов. То, что std::string_view можно "прицеплять" не только к строкам std::string, но и к обычным C-строкам - это еще одна дополнительная ценнейшая функциональность std::string_view. То есть std::string_view позволяет нам не только унифицировать строки с подстроками, но еще и унифицировать константную обработку std::string строк с C-строками.

Ответ 2



Если вам в функцию требуется передать строку без копирования ее целиком, и в этой функции вы можете заменить ее на string_view, то лучше использовать именно ее. Все дело в том, что если вы передаёте в эту функцию не std::string, а указатель на char. В случае использования std::string (даже константной ссылки) будет создан полноценный объект, а строка полностью скопирована. В случае string_view никакого копирования не произойдет.

Комментариев нет:

Отправить комментарий