On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 25.05.18 16:17. Заголовок: Предложение по включению в стандарт C++ перегрузки функции substr для класса std::basic_string


В настоящий момент функция-член класса 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..

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет