Строковый класс C ++ имеет много проблем, и да, то, что вы описываете, является одной из них.
В частности, нет способа выполнить обработку строки без создания копии строки, которая может быть дорогой.
И поскольку практически все алгоритмы обработки строк реализованы как члены класса, они могут только использоваться в классе строк.
Решением, с которым вы можете поэкспериментировать, является комбинация Boost.Range и Boost.StringAlgo.
Диапазон позволяет создавать последовательности из пары итераторов. Они не берут на себя ответственность за данные, поэтому не копируют строку. они просто указывают на начало и конец вашей строки * char.
И Boost.StringAlgo реализует все общие строковые операции как функции, не являющиеся членами, которые могут применяться к любой последовательности символов. Таких как, например, Boost range.
Комбинация этих двух библиотек в значительной степени решает проблему. Они позволяют вам избежать копирования ваших строк для их обработки.
Другим решением может быть сохранение ваших строковых данных как std::string
все время . Когда вам нужно передать char*
какой-либо функции API, просто передайте ей адрес первого символа. (& Ул [0]).
Проблема с этим вторым подходом заключается в том, что std :: string не гарантирует, что его строковый буфер завершается нулем, поэтому вы должны либо полагаться на детали реализации, либо вручную добавлять нулевой байт как часть строка.