Мне понятно, что std::string_view
это строка, имеющая только указатель и длину, без владения, управления памятью и даже без завершающего нуля — и поэтому она не имеет функции c_str()
. Но не смог разобраться(найти пример), когда он может быть предпочтительней или удобней std::string
? Если не затруднит, прошу ответить с примером.
Проблема, которую решает 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-строками.
Если вам в функцию требуется передать строку без копирования ее целиком, и в этой функции вы можете заменить ее на string_view, то лучше использовать именно ее. Все дело в том, что если вы передаёте в эту функцию не std::string, а указатель на char. В случае использования std::string (даже константной ссылки) будет создан полноценный объект, а строка полностью скопирована. В случае string_view никакого копирования не произойдет.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Долгое время воевал один с этой задачей, но больше сил нетПростая задача - объединить две (или более) картинки в одну, чтобы наложить на эту...
Есть вот такой вот код, замеряющий время работы трех разных функции умножения матриц и записывающий их в файл:
Как правильно передавать std::string_view в функцию, если не надо изменять строку?