Форум » C/C++ » Предложение по включению в стандарт C++ перегрузки функции substr для класса std::basic_string » Ответить

Предложение по включению в стандарт C++ перегрузки функции substr для класса std::basic_string

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

Ответов - 0



полная версия страницы