Асимметрия строки :: find_first_of и string :: find_last_of

С помощью функции-члена function :: find_first_of в стандартной библиотеке C ++ вы можете искать в пустой подстроке:

 s.find_first_of(c, s.size())

или

s.find_first_of(c, string::npos)

Но вы не можете искать в пустой подстроке с помощью string :: find_last_of ; следующий вызов будет искать в подстроке, содержащей (только) первый символ:

 s.find_last_of(c, 0)

Я думаю, что это несовершенство стандартной библиотеки C ++, не так ли?

3
nl ja de
@ 111111: npos - действительный ввод. Фактически, многие строковые функции используют его как аргумент по умолчанию для параметра position.
добавлено автор AnT, источник
@ 111111: npos - действительный ввод. Фактически, многие строковые функции используют его как аргумент по умолчанию для параметра position.
добавлено автор AnT, источник
что такое c в этом случае? std :: string , char , cont char * ? Также я ничего не вижу в документе, предполагая, что npos является допустимым вводом для параметра позиции.
добавлено автор 111111, источник
что такое c в этом случае? std :: string , char , cont char * ? Также я ничего не вижу в документе, предполагая, что npos является допустимым вводом для параметра позиции.
добавлено автор 111111, источник
Это не имеет значения, но я имел в виду char .
добавлено автор Igor I., источник

2 ответы

Здесь я не вижу никакой асимметрии. На самом деле все наоборот, оно выглядит совершенно симметричным. Подумайте о find_first_of в качестве поиска в right из некоторой исходной позиции, а find_last_of - это поиск в left с некоторой начальной позиции.

Имя find_last_of имеет обманчивое качество: оно подразумевает естественный поиск forward , за исключением того, что мы возвращаем последнее вхождение вместо первого. Однако с двунаправленными последовательностями можно игнорировать «форвардную» природу имени и думать о нем как о обратном поиске. Обратный поиск также возвращает первое вхождение, он просто переходит из влево из начальной точки. С этой точки зрения функция симметрична с помощью find_first_of .

EDIT: After reading your comments I finally understand your point. So, the problem is that the current semantics of pos parameter makes it impossible to specify empty search region for find_last_of. Yes, that makes sense. I agree, that is indeed something that can be seen as inconsistency in find_last_of design.

Для целей согласования я действительно ожидал бы find_last_of не включительно в отношении значения pos . В этом случае спецификация целевой позиции xpos , возвращаемая find_last_of , будет

xpos < pos and xpos < size();

В этом случае s.find_last_of (c, 0) будет искать пустой префикс, а s.find_last_of (c, s.size ()) будет искать всю строку.

Однако стандарт говорит

xpos <= pos and xpos < size();

Я действительно не знаю, почему они решили указать параметр pos такой инклюзивный смысл. Вероятно, они думали, что это облегчит понимание.

4
добавлено
@Igor I: Я не уверен, что вы имеете в виду. Вы имели в виду, что они должны быть в префиксе? Поскольку сейчас все происходит так, это не так. find_first_of в суффиксе строки , т. е. он ищет вперед после pos . find_last_of в префиксе префикса , т. е. он по существу ищет назад до pos .
добавлено автор AnT, источник
Вперед или назад обе функции выполняют поиск в префиксе строки , а не в суффиксе. В этом отношении они должны быть равными.
добавлено автор Igor I., источник
Извините, я был дважды ошибаюсь. Во-первых, мне пришлось писать «в суффиксе , а не в префиксе»; и во-вторых, я должен был указать, что в случае find_last_of это суффикс перевернутой строки (потому что find_last_of поиск назад). Но концептуально оба случая должны обрабатываться одинаково, и если для find_first_of разрешен пустой суффикс, он должен быть разрешен для find_last_of .
добавлено автор Igor I., источник

Здесь я не вижу никакой асимметрии. На самом деле все наоборот, оно выглядит совершенно симметричным. Подумайте о find_first_of в качестве поиска в right из некоторой исходной позиции, а find_last_of - это поиск в left с некоторой начальной позиции.

Имя find_last_of имеет обманчивое качество: оно подразумевает естественный поиск forward , за исключением того, что мы возвращаем последнее вхождение вместо первого. Однако с двунаправленными последовательностями можно игнорировать «форвардную» природу имени и думать о нем как о обратном поиске. Обратный поиск также возвращает первое вхождение, он просто переходит из влево из начальной точки. С этой точки зрения функция симметрична с помощью find_first_of .

EDIT: After reading your comments I finally understand your point. So, the problem is that the current semantics of pos parameter makes it impossible to specify empty search region for find_last_of. Yes, that makes sense. I agree, that is indeed something that can be seen as inconsistency in find_last_of design.

Для целей согласования я действительно ожидал бы find_last_of не включительно в отношении значения pos . В этом случае спецификация целевой позиции xpos , возвращаемая find_last_of , будет

xpos < pos and xpos < size();

В этом случае s.find_last_of (c, 0) будет искать пустой префикс, а s.find_last_of (c, s.size ()) будет искать всю строку.

Однако стандарт говорит

xpos <= pos and xpos < size();

Я действительно не знаю, почему они решили указать параметр pos такой инклюзивный смысл. Вероятно, они думали, что это облегчит понимание.

4
добавлено
@Igor I: Я не уверен, что вы имеете в виду. Вы имели в виду, что они должны быть в префиксе? Поскольку сейчас все происходит так, это не так. find_first_of в суффиксе строки , т. е. он ищет вперед после pos . find_last_of в префиксе префикса , т. е. он по существу ищет назад до pos .
добавлено автор AnT, источник
Вперед или назад обе функции выполняют поиск в префиксе строки , а не в суффиксе. В этом отношении они должны быть равными.
добавлено автор Igor I., источник
Извините, я был дважды ошибаюсь. Во-первых, мне пришлось писать «в суффиксе , а не в префиксе»; и во-вторых, я должен был указать, что в случае find_last_of это суффикс перевернутой строки (потому что find_last_of поиск назад). Но концептуально оба случая должны обрабатываться одинаково, и если для find_first_of разрешен пустой суффикс, он должен быть разрешен для find_last_of .
добавлено автор Igor I., источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest