Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

Std::string_view - что за зверь и для чего в итоге нужен?

11.06.2023, 16:31. Показов 1713. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста, для чего нужен std::string_view ? В чем его принципиальное отличие от std::string ?

Гугл подсказывает вот такие основные тезисы:

std::string_view представляет собой облегченную ссылку без владения на последовательность символов в std::string или любом другом непрерывном хранилище символов. Он обеспечивает просмотр основных символьных данных только для чтения без создания копии.

Вот несколько причин, почему это std::string_viewможет быть полезно:

-Эффективный доступ только для чтения: std::string_viewпозволяет вам получать доступ к строкам и управлять ими без дополнительных затрат на копирование базовых данных. Он обеспечивает облегченную альтернативу, std::stringкогда вам нужно только прочитать или обработать строку без ее изменения.

-Как избежать копирования строк: с помощью std::string_view, вы можете передавать подстроки или части строк функциям без создания копий. Это может быть особенно полезно в ситуациях, когда у вас есть большие строки или вам нужно часто обрабатывать подстроки.

-Совместимость: std::string_view позволяет работать со строками из разных источников или API без явного преобразования их в файлы std::string. Его можно использовать для эффективного взаимодействия со строками в стиле C или другими строковыми представлениями.
Если честно не понятно в итоге, что это и зачем.
Единственно звучит так, как будто std::string_view - это просто какой то указатель на std::string или отдельный символ в строке. Но, если так, То не понятно, а в чем отличие от работы указателя на строку?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2023, 16:31
Ответы с готовыми решениями:

Pragma link - что за зверь и для чего нужно?
Обычно, когда добавляешь к проекту сторонний компонент, то в тексте юнита появляется запись наподобие #pragma link...

Почему std::string_view МЕДЛЕННЕЕ, чем std::string?
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до нескольких гигабайт). Почему в...

Std::move что за зверь?
Есть код Acceptor'a: void SocketWorker::doAccept() { mAcceptor.async_accept(mSocket, (boost::system::error_code ec) { if (!ec...

13
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6099 / 2792 / 1037
Регистрация: 01.06.2021
Сообщений: 10,210
11.06.2023, 17:06
Optimus11, если строка только для чтения, то начиная с С++17 рекомендовано использовать string_view, который производительнее обычной string. В том числе, именно ее и нужно передавать в функцию, а не константную string по ссылке и пр.

Optimus11, а тут указаны некоторые преимущества.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.06.2023, 17:35
Optimus11, std::string_view не владеет данными, в его распоряжении есть только указатель на константную строку и константные функции - члены. по этому этот класс стоит выбирать если не нужно менять исходные данные.
проще всего std::string_view представлять как константный std::string.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
11.06.2023, 17:42  [ТС]
Цитата Сообщение от _stanislav Посмотреть сообщение
Optimus11, std::string_view не владеет данными, в его распоряжении есть только указатель на константную строку и константные функции - члены. по этому этот класс стоит выбирать если не нужно менять исходные данные.
проще всего std::string_view представлять как константный std::string.
Представить то я представил, но зачем тогда нужен std::string_view, если есть константный std::string.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.06.2023, 17:45
Optimus11, чтобы память не выделять.
Вот например задача получить подстроку из строки. Если эту подстроку не предполагается менять, то подстрока в виде string_view гораздо эффективнее, чем подстрока в виде string, потому что не выделяется память, не производится копирование.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.06.2023, 17:46
Optimus11,
C++
1
2
3
4
const char * s{ "const string" };
 
std::string_view sv{ s };  // данные на которые указывает s не копируются в sv, копируется только указатель
std::string ss{ s };       // данные на которые указывает s копируются в ss
первый вариант эффективней
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
11.06.2023, 17:53  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Optimus11, чтобы память не выделять.
Вот например задача получить подстроку из строки. Если эту подстроку не предполагается менять, то подстрока в виде string_view гораздо эффективнее, чем подстрока в виде string, потому что не выделяется память, не производится копирование.
Но подстроку из строки - я могу получить не обязательно в std::string c выделением памяти.
Я банально вызову strstr(). strstr - вернет указатель на подстроку, размер подстроки мне и известен. Вот я и будут с ней работать ? Без всякого выделения дополнительной памяти.
Или все так все посложнее ?

Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
Optimus11,
C++
1
2
3
4
const char * s{ "const string" };
 
std::string_view sv{ s };  // данные на которые указывает s не копируются в sv, копируется только указатель
std::string ss{ s };       // данные на которые указывает s копируются в ss
первый вариант эффективней
Это я вроде бы понял, вопрос в том зачем условно мне "sv" указывающий на " char * s", если у меня есть прямой указатель " char * s" ?
Зачем мне посредник между в виде "sv" ?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.06.2023, 17:57
Цитата Сообщение от Optimus11 Посмотреть сообщение
вопрос в том зачем условно вне sv указывающий на " char * s", если у меня есть прямой указатель на " char * s" ?
у std::string_view есть удобные функции-члены, их вызывать проще чем сишные функции для сишных строк типа strstr, но это уже другой вопрос, тут уже какой парадигмы программирования ты придерживаешься.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
11.06.2023, 18:01
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Я банально вызову strstr(). strstr - вернет указатель на подстроку, размер подстроки мне и известен.
И будете вручную эмулировать string_view.

Цитата Сообщение от Optimus11 Посмотреть сообщение
Зачем мне посредник между в виде "sv" ?
Зачем вообще нужны абстракции?
Чтобы упростить код.
string_view - это абстракция над кусочком строки.

Вы можете отказаться от абстракций и снова спуститься на низкий уровень указателя на буфер и его размера, пожалуйста, но это неудобно. Все, что получите - это ручное воссоздание функциональности, которую делала абстракция, от которой вы отказались.
4
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.06.2023, 18:12
Optimus11, в большом проекте код написанный в ООП стиле читать проще чем код написанный в структурном стиле, повторюсь о важности выбора правильных абстракций, они помогают поддерживать и развивать большой проект.
( правильные интерфейсы между абстракциями тоже важны )
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.06.2023, 14:32
Цитата Сообщение от Optimus11 Посмотреть сообщение
для чего нужен std::string_view ?
есть 3 причины, зачем тебе нужен std::string_view:
1. ты хочешь получить такой же удобный инструмент как std::string
2. в отличие от std::string, не кушает память.
3. умеет работать в компалтайме.


причем, 3й пункт - это прям киллер фича.
стандартные сишные функции такое не умеют.


https://rextester.com/NGHP90826

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
 
constexpr bool foo(std::string_view s) noexcept
{
    return s.find("hello") != std::string_view::npos;
}
 
template<bool has_hello> struct example
{
    example() { std::cout << std::boolalpha << has_hello << '\n'; }
};
 
int main()
{
    example< foo("hello, Optimus11")>();
    example< foo("Hello, DrOffset" )>();    
}
5
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
12.06.2023, 14:49
Цитата Сообщение от hoggy Посмотреть сообщение
constexpr bool foo(std::string_view s) noexcept
{
    return s.find("hello") != std::string_view::npos;
}
круто

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
3. умеет работать в компалтайме.
пожалуй самый весомый аргумент
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
13.06.2023, 01:59
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите пожалуйста, для чего нужен std::string_view ? В чем его принципиальное отличие от std::string ?
Это дизайн-проблема, с которой мы постоянно сталкивается как в С++, так и в С. Функции стандартной библиотеки (или третьих API) обычно заточены по работу со строками, а в реальной жизни нам очень часто нужны такие же функции, но для работы с подстрокой в составе более длинной строки. Например, меня не устраивает функция atoi, потому что она не позволяет мне сконвертировать в число именно символы с 15-го по 18-ый. Попросить ее начать с 15 я могу, а вот попросить закончить на 18 - нет.

Из-за этого приходится извращаться тем или иным образом: копировать подстроку в отдельную строку (очень неэффективно), вставлять временный \0 в С-строку (костыль и не всегда допустимо). Или приходится или разрабатывать дополнительные функции API, ориентированные на работу именно с подстроками в дополнение к API, ориентированному на работу с целыми строками (чревато комбинаторным взрывом количества вариантов).

std::string_view призван унифицировать все подобные API. Это просто диапазон, который позволяет вам задать, от куда до куда должна работать функция. std::string_view не выделяет никакой дополнительной памяти. Фактически все функции, которые вы пишете для немодифицирующей обработки строк (т.е. функции, принимающие на вход некий условный const std::string &) должны принимать на вход именно std::string_view. В большинстве случаев в точке вызова такая замена пройдет безболезненно.

Было

C++
1
2
3
4
5
6
7
8
9
10
11
#include <string>
#include <iostream>
 
void output_string(const std::string_view &s) { std::cout << s << std::endl; }
 
int main()
{
  std::string s = "Hello World";
  output_string(s);
  output_string(s.substr(6));
}
стало

C++
1
2
3
4
5
6
7
8
9
10
11
#include <string>
#include <iostream>
 
void output_string(std::string_view s) { std::cout << s << std::endl; }
 
int main()
{
  std::string s = "Hello World";
  output_string(s);
  output_string({ s.begin() + 6, s.end() });
}
То есть мы получаем ту же самую функциональность, но без дорогостоящего вызова substr в первом варианте.

Это касается не только строк, но и вообще всех последовательностей, в особенности для тех, которые непрерывно расположены в памяти. Изначально планировалось создать аналогичный std::vector_view и т.п., но в итоге эта идея была материализована в виде std::span - более общий аналог std::string_view для непрерывных последовательностей.
7
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
13.06.2023, 18:06
TheCalligrapher, для последовательностей которые поддерживают LegacyContiguousIterator?
так правильно говорить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.06.2023, 18:06
Помогаю со студенческими работами здесь

Вывод строки std::string_view
Здравствутйте. Есть такой код. Функция перебирает все возможные варианты перестановки чисел в векторе, котрые соответствуют кейсам....

Scripting console -- что за зверь и нужен ли вообще?
День добрый, госопда хорошие! Так уж получилось, что до использования codeblocks никогда не попадалось на глаза нечто с названием...

Что такое Sub и для чего он нужен
как объяснить sub преподу, то что это процедура его не устраивает

targetver.h для чего он нужен что он делает ?
Полтора месяца назад начал изучать С++, ну вроде печатать немного научился и как говориться к голове доходит через руки , так вот и мне...

Tomcat что такое и для чего он нужен?
что такое Tomcat, с чем его едят и для чего он нужен?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru