Что такое string_view?

string_view была предложена функция в рамках библиотеки C ++ Основы TS (N3921) добавлено в C ++ 17

Насколько я понимаю, это тип, который представляет какую-то строковую «концепцию», которая является представлением любого типа контейнера, который может хранить что-то видимое в виде строки.

  • Это правильно ?
  • Должен канонический
    const std::string& тип параметра становится string_view ?
  • Есть ли еще один важный момент о string_view принимать во внимание ?

110

Решение

Цель любого и всех видов предложений «ссылка на строку» и «ссылка на массив» состоит в том, чтобы избежать копирования данных, которые уже принадлежат где-то еще и для которых требуется только неизменяемое представление. string_view речь идет об одном таком предложении; были более ранние string_ref а также array_ref, тоже.

Идея состоит в том, чтобы всегда хранить пару указателей на первый элемент и размер некоторых существующий массив данных или строка.

Такой класс дескриптора представления может передаваться дешево по значению и предлагать дешевые операции подстроки (которые могут быть реализованы в виде простых приращений указателя и корректировки размера).

Многие виды использования строк не требуют фактического владения строками, и рассматриваемая строка часто уже будет принадлежать кому-то еще. Таким образом, существует реальный потенциал для повышения эффективности за счет исключения ненужных копий (подумайте обо всех выделениях и исключениях, которые вы можете сохранить).

Исходные строки C страдали от проблемы, заключавшейся в том, что нулевой терминатор был частью строкового API, и поэтому вы не могли легко создавать подстроки без изменения базовой строки (а-ля strtok). В C ++ это легко решить, сохранив длину отдельно и поместив указатель и размер в один класс.

Одно серьезное препятствие и расхождение с философией стандартной библиотеки C ++, о которой я могу думать, состоит в том, что такие классы «ссылочного представления» имеют совершенно другую семантику владения от остальной части стандартной библиотеки. По сути, все остальное в стандартной библиотеке безусловно безопасно и правильно (если оно компилируется, это правильно). С такими классами ссылок это уже не так. Правильность вашей программы зависит от окружающего кода, который использует эти классы. Так что это сложнее проверить и научить.

142

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]