#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 никакого копирования не произойдет.
Комментариев нет:
Отправить комментарий