Существует ли стандартный библиотечный класс для подстрок?

#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 .

Вместо копирования строк, с которыми вы работаете, строковое представление предоставляет представление основной строки — в значительной степени просто указатель на начало строки и ее размер.