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

186
26 октября 2021, 05:20

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

Answer 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-строками.

Answer 2

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

READ ALSO
Соединить две (или более) текстуры в одну

Соединить две (или более) текстуры в одну

Долгое время воевал один с этой задачей, но больше сил нетПростая задача - объединить две (или более) картинки в одну, чтобы наложить на эту...

112
Несколько функций main

Несколько функций main

Легален ли следующий код с точки зрения стандарта?

99
C++ - volatile при замере времени

C++ - volatile при замере времени

Есть вот такой вот код, замеряющий время работы трех разных функции умножения матриц и записывающий их в файл:

98
Передача string_view по ссылке или значению

Передача string_view по ссылке или значению

Как правильно передавать std::string_view в функцию, если не надо изменять строку?

179