В настоящий момент функция-член класса
substr в шаблонном классе
std::basic_string имеет всего лишь одно объявление
basic_string substr(size_type pos = 0, size_type n = npos) const;
Фактически, это ничто иное, как альтернатива конструктору класса
basic_string(const basic_string& str, size_type pos, size_type n,
const Allocator& a = Allocator());
Однако использование функции
substr бывает более выразительным, чем использование вместо него соответствующего конструктора.
Эту функцию удобно использовать с другими функциями класса, которые имеют дело с позициями в строке, например, с алгоритмами, включенными в сам класс
std::basic_string.
Но не всегда встроенные алгоритмы могут выполнить поставленную задачу. Например, рассмотрим задачу нахождения первого символа в строке, который не является "белым пробелом". Для этой задачи лучше использовать стандартные алгоритмы, как, например, стандартный алгоритм
std::find_if_not. Соответствующий код может выглядеть следующим образом
auto first = std::find_if_not( std::begin( s ), std::end( s ), ::isspace );
Допустим также, что имеется уже найденный некоторый второй итератор, названный
last. Эти два итератора,
first и
last, задают некоторый диапазон строки, который мы хотим выделить в некоторую новую строку, используя функцию
substr. Тогда нам придется написать что-то вроде следующего выражения
s.substr( std::distance( std::begin( s ), first ), std::distance( first, last ) )
Это выражение выглядит слишком сложным и плохо читаемым. Почему бы сразу же не написать
s.substr( first, last )
Такое выражение более наглядно и уже знакомо по использованию других функций-членов класса
std::basic_string.
Чтобы такая запись была допустима, нужна следующая перегрузка функции
substr
basic_string substr( const_iterator first, const_iterator last ) const;
которая в настоящий момент отсутствует в стандарте
C++.
Фактически, эта перегрузка является зеркальным отображением перегрузки функции
erase iterator erase(const_iterator first, const_iterator last); Первая из этих перегрузок выделяет подстроку, а вторая перегрузка удаляет подстроку, используя диапазон, заданный итераторами.
Так что было бы логически последовательным включить эту новую дополнительную перегрузку функции
substr в класс
std::basic_string, о чем я уже написал на форуме по предложениям по изменению стандарта
C++ на
isocpp.org..