string_view
была предложена функция в рамках библиотеки C ++ Основы TS (N3921) добавлено в C ++ 17
Насколько я понимаю, это тип, который представляет какую-то строковую «концепцию», которая является представлением любого типа контейнера, который может хранить что-то видимое в виде строки.
const std::string&
тип параметра становится string_view
?string_view
принимать во внимание ?Цель любого и всех видов предложений «ссылка на строку» и «ссылка на массив» состоит в том, чтобы избежать копирования данных, которые уже принадлежат где-то еще и для которых требуется только неизменяемое представление. string_view
речь идет об одном таком предложении; были более ранние string_ref
а также array_ref
, тоже.
Идея состоит в том, чтобы всегда хранить пару указателей на первый элемент и размер некоторых существующий массив данных или строка.
Такой класс дескриптора представления может передаваться дешево по значению и предлагать дешевые операции подстроки (которые могут быть реализованы в виде простых приращений указателя и корректировки размера).
Многие виды использования строк не требуют фактического владения строками, и рассматриваемая строка часто уже будет принадлежать кому-то еще. Таким образом, существует реальный потенциал для повышения эффективности за счет исключения ненужных копий (подумайте обо всех выделениях и исключениях, которые вы можете сохранить).
Исходные строки C страдали от проблемы, заключавшейся в том, что нулевой терминатор был частью строкового API, и поэтому вы не могли легко создавать подстроки без изменения базовой строки (а-ля strtok
). В C ++ это легко решить, сохранив длину отдельно и поместив указатель и размер в один класс.
Одно серьезное препятствие и расхождение с философией стандартной библиотеки C ++, о которой я могу думать, состоит в том, что такие классы «ссылочного представления» имеют совершенно другую семантику владения от остальной части стандартной библиотеки. По сути, все остальное в стандартной библиотеке безусловно безопасно и правильно (если оно компилируется, это правильно). С такими классами ссылок это уже не так. Правильность вашей программы зависит от окружающего кода, который использует эти классы. Так что это сложнее проверить и научить.
Других решений пока нет …