Почему std::ranges::find_if возвращает итератор, а std::ranges::find_last_if — нет?

Читая cppreference.com, я заметил ranges::find_last_if не возвращает итератор, а ranges::find_if возвращает. Мне интересно, есть ли веская причина для такого решения?

Судя по всему, правильно использовать ranges::find_if с обратным диапазоном:

const auto it = std::ranges::find_if (data | std::views::reverse, func);

Тем не менее, ranges::find_last_if возврат итератора кажется мне более интуитивным, поэтому мне интересно узнать о его цели.

Обоснование можно найти здесь.

n. m. could be an AI 21.04.2024 10:59

Кстати, правильное использование: const auto it = std::ranges::find_last_if (data, func).begin();

cpplearner 21.04.2024 11:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, алгоритмы std::ranges возвращают конечный итератор всякий раз, когда могут.

Например,

  • std::ranges::for_each возвращает in_fun_result. Компонент in — это итератор конца исходного диапазона.
  • std::ranges::copy возвращает in_out_result. in — итератор конца исходного диапазона, а out — итератор конца целевого диапазона. (std::copy возвращает только конец диапазона назначения.)
  • std::ranges::fill и std::ranges::generate возвращают итератор в конец диапазона назначения. (Алгоритмы std ничего не возвращают.)

Причина в том, что, в отличие от традиционных алгоритмов std, ranges используют итератор и страж. Единственное, что вы можете сделать со стражей (которая сама по себе не является итератором), — это сравнить ее с итератором. Если они сравниваются равными, это означает, что достигнут конец диапазона.

Поскольку дозорный объект менее полезен, чем итератор, и этим алгоритмам в любом случае необходимо получить конечный итератор, они возвращают этот итератор, чтобы не потерять ценную информацию.

Для std::ranges::find_last_if это означает, что он должен вернуть итератор найденному элементу и конечный итератор. Они естественным образом образуют subrange, и именно это std::ranges::find_last_if на самом деле и возвращает.

Если вам не нужен конечный итератор, вы можете извлечь первый итератор, используя subrange::begin.

const auto it = std::ranges::find_last_if (data, func).begin();

Другие вопросы по теме