#c #c 17
Вопрос:
У меня есть большая строка, доступная только для чтения, которую я сканирую на предмет синтаксиса, и на основе этого простого синтаксиса я извлекаю кучу строк меньшего размера, которые я использую позже для дальнейшей обработки. Основываясь на тестировании, создание и копирование большей части большой строки в маленькие строки является своего рода узким местом производительности (их тысячи на каждую большую строку).
Я решил, что на самом деле мне не нужно выделять для -, и все же скопировал данные. Что мне действительно нужно, так это своего рода тип фрагмента строки, вместо которого будет храниться только указатель на начало соответствующих данных и длину, но в то же время он должен быть заменой std::string и всех стандартных взаимодействий с библиотекой, которые у него есть.
В любом случае это было бы проще всего реализовать, для этого я мог бы создать свой собственный класс и реализовать необходимые мне функции, но если в стандартной библиотеке уже есть что-то подобное, то зачем беспокоиться.
Итак, в принципе, есть ли в STL класс типа подстроки?
Ответ №1:
Да, начиная с C 17 у вас есть std::string_view
.
Пример:
#include <iostream>
#include <string>
#include <string_view>
int main() {
std::string foo = "Hello world";
std::string_view a(foo.c_str(), 5);
std::string_view b(foo.c_str() 6, 5);
std::cout << a << 'n' // prints Hello
<< b << 'n'; // prints world
}
Ответ №2:
Именно здесь использование std::string_view
instead of std::string
очень полезно для сокращения копий этих исходных строк и возможности их использования std::string_view::substr
.
Вместо копирования строк, с которыми вы работаете, строковое представление предоставляет представление основной строки — в значительной степени просто указатель на начало строки и ее размер.