Представление строк в C++

Predstavlenie Strok V C



В области программирования на C++ решающее значение имеет расстановка приоритетов эффективности и производительности. Класс «std::string_view», представленный в C++17, представляет собой универсальную и эффективно использующую память альтернативу традиционным манипуляциям со строками. По своей сути «std::string_view» — это не владеющая ссылкой на последовательность символов, обычно представляющая подстроку более крупной строки. В отличие от «std::string», который владеет своими данными и управляет внутренней памятью, «std::string_view» работает без владения базовыми данными. Эта характеристика делает его особенно ценным для сценариев, где накладные расходы на копирование или управление памятью нежелательны. В этой статье мы рассмотрим различные примеры, чтобы понять использование «std::string_view» в C++.

Пример 1. Эффективная обработка строк

В современной разработке на C++ эффективная обработка строк имеет решающее значение для оптимизации производительности и использования ресурсов. Это обеспечивает эффективный доступ и манипулирование строками без необходимости перераспределения или дублирования памяти. Чтобы проиллюстрировать эту концепцию, давайте углубимся в практический пример.







Рассмотрим следующий фрагмент кода:



#include
#include

недействительный процессStringView ( std::string_view strView ) {

станд::cout << 'Длина: ' << strView.length ( ) << станд::эндл;
станд::cout << 'Содержание: ' << стрвиев << станд::эндл;
}

int главный ( ) {

std::string originalString = «Эффективная обработка строк» ;

std::string_view viewOfString ( оригинальная строка ) ;

процессстрингвиев ( ViewOfString ) ;

возвращаться 0 ;
}


В этом примере у нас есть функция «processStringView», которая принимает «std::string_view» в качестве параметра. Затем функция печатает длину и содержимое строкового представления, используя стандартный вывод. Основная функция инициализирует «std::string» с именем «originalString» значением «Эффективная обработка строк». Впоследствии создается «std::string_view» с именем «viewOfString», ссылающийся на содержимое «originalString».



Передавая «viewOfString» в функцию «processStringView», мы можем эффективно выполнять операции со строкой, устраняя необходимость в дополнительном выделении памяти. «std::string_view» — это упрощенная ссылка на базовую последовательность символов «originalString» без копирования данных.





Вот сгенерированный результат:



Пример 2: Взаимодействие с устаревшим кодом

В сфере разработки на C++ плавная интеграция новых и старых баз кода часто является критической проблемой. «std::string_view» позволяет разработчикам легко взаимодействовать с устаревшими функциями, которые возвращают указатели «const char».

Рассмотрим следующий пример, демонстрирующий практическое использование «std::string_view» для обеспечения совместимости. Здесь у нас есть устаревшая функция с именем «legacyFunction()», которая возвращает указатель «const char»:

#include
#include

константный символ * наследиеФункция ( ) {
возвращаться 'Наследная строка' ;
}

int главный ( ) {

std::string_view наследиеStrView ( наследиеФункция ( ) ) ;

станд::cout << 'Просмотр устаревшей строки: ' << наследиеStrView << станд::эндл;

возвращаться 0 ;
}


Мы начнем с определения устаревшей функции с именем «legacyFunction()», которая возвращает указатель «const char», представляющий строку, помеченную как «Legacy String». Чтобы беспрепятственно включить эти устаревшие данные в нашу современную программу на C++, мы используем «std::string_view». В частности, в функции main() мы создаем экземпляр «std::string_view» с именем «legacyStrView» и инициализируем его результатом устаревшей функции. Такое создание экземпляра позволяет нам эффективно инкапсулировать устаревший указатель const char и работать с ним.

В результате мы можем получить доступ к устаревшей строке и манипулировать ею, не прибегая к ненужному копированию данных, сохраняя при этом эффективность и совместимость. Последний шаг кода включает использование «std::cout» для печати содержимого устаревшего строкового представления.

Выполненный вывод:

Пример 3. Улучшенная обработка строковых литералов

Строковые литералы в C++ традиционно представляются как массивы символов. «std::string_view» упрощает работу со строковыми литералами, предоставляя удобный интерфейс. Предоставляя прямой доступ к базовому массиву символов без необходимости явных преобразований, «std::string_view» упрощает операции со строковыми литералами.

#include
#include

int главный ( ) {
константный символ * мойЛитерал = «Привет, строковый просмотр!» ;
std::string_view literalView ( мой литерал ) ;

станд::cout << «Первый персонаж:» << буквальное представление [ 0 ] << станд::эндл;

size_t позиция = literalView.find ( 'Нить' ) ;
станд::cout << 'Позиция подстроки: ' << позиция << станд::эндл;

возвращаться 0 ;
}


В этом примере «Hello, String View!» строковый литерал присваивается указателю «myLiteral». Введение «std::string_view» способствует более эффективному представлению этой строки без необходимости копирования ее содержимого. Объект «literalView» создается с использованием указателя «myLiteral», который позволяет нам просматривать и манипулировать базовой последовательностью символов.

Использование «std::string_view» обеспечивает легкий доступ к отдельным символам внутри строки. Во фрагменте кода «literalView[0]» извлекает и печатает первый символ строки, демонстрируя простоту и прямоту доступа к элементам. Метод «find» «std::string_view» используется для определения положения подстроки «String» в исходной строке.

Пример 4: Извлечение подстроки

Задача извлечения подстроки включает в себя извлечение части заданной строки на основе заданных критериев, таких как положение разделителя. Возможность легко извлекать подстроки — мощная функция «std::string_view». Рассмотрим сценарий, в котором нам нужно извлечь часть строки на основе разделителя:

#include
#include

int главный ( ) {
std::string FullString = «яблоко-апельсин-банан» ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , разделительPos ) ;

станд::cout << 'Извлеченная подстрока: ' << подстрока << станд::эндл;

возвращаться 0 ;
}


В этом фрагменте кода мы начинаем с объявления исходной строки «fullString», которая инициализируется значением «яблоко-апельсин-банан». Наша цель — выполнить извлечение подстроки. Для этого мы используем функцию «найти», предоставляемую стандартной библиотекой C++.

Как только мы определим положение разделителя в «fullString», хранящееся в переменной «delimiterPos», мы извлекаем нужную подстроку. Функция «substr» вызывается для исходной строки, определяя начальную позицию (0) и длину подстроки, которая точно соответствует положению разделителя. Эта операция приводит к созданию объекта «std::string_view» с именем «subString», который представляет часть исходной строки от начала до разделителя.

Пример 5: Структуры данных с эффективным использованием памяти

«std::string_view» играет решающую роль в разработке структур данных, эффективно использующих память. Вместо хранения нескольких копий строк структуры данных могут хранить экземпляры «std::string_view», тем самым уменьшая нагрузку на память.

#include
#include

структура записи {
std::string_view имя;
средний возраст;
} ;

int главный ( ) {

Запись человека = { 'Джон Доу' , 30 } ;

станд::cout << 'Имя: ' << имя человека << ', Возраст: ' << человек.возраст << станд::эндл;

возвращаться 0 ;
}


В этом фрагменте кода мы демонстрируем использование «std::string_view» в структуре данных, эффективно использующей память. Мы определяем структуру «Record», которая включает член «std::string_view» с именем «name» и целочисленный элемент с именем «age». Использование «std::string_view» в этом контексте позволяет нам создать облегченное представление строки без необходимости дополнительного выделения памяти.

В функции «main» мы создаем экземпляр объекта «Record» с именем «person» с именем «Джон Доу» и возрастом 30 лет. Член «name» «std::string_view» служит представлением, не являющимся владельцем символьные данные, соответствующие имени, что устраняет необходимость дублирования содержимого строки. «std::cout << «Имя:» << person.name << «, Возраст: » << person.age << std::endl;» Оператор выводит имя и возраст человека, которые хранятся в объекте «Запись».

Заключение

В постоянно меняющемся ландшафте разработки C++ «std::string_view» выделяется как ценное дополнение к набору инструментов программиста. Примеры, проиллюстрированные в этой статье, подчеркивают адаптируемость и полезность «std::string_view» в области программирования на C++. От эффективного манипулирования строками и полной совместимости с устаревшим кодом до структур данных, эффективно использующих память, «std::string_view» ценен для разработчиков, которые стремятся повысить производительность и оптимизировать код в различных сценариях. Эти реальные сценарии демонстрируют, как «std::string_view» может оптимизировать код, уменьшить ненужные затраты памяти и повысить общую эффективность приложений C++.