Namespaces
Variants

std::experimental::ranges:: find, std::experimental::ranges:: find_if, std::experimental::ranges:: find_if_not

From ru.cppreference.net
Определено в заголовке <experimental/ranges/algorithm>
template < InputIterator I, Sentinel < I > S, class T, class Proj = ranges:: identity >

requires IndirectRelation < ranges:: equal_to <> , projected < I, Proj > , const T * >

I find ( I first, S last, const T & value, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class T, class Proj = ranges:: identity >

requires IndirectRelation < ranges:: equal_to <> ,
projected < ranges:: iterator_t < R > , Proj > , const T * >

ranges:: safe_iterator_t < R > find ( R && r, const T & value, Proj proj = Proj { } ) ;
(2) (ranges TS)
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < I, Proj >> Pred >

I find_if ( I first, S last, Pred pred, Proj proj = Proj { } ) ;
(3) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < ranges:: iterator_t < R > , Proj >> Pred >

ranges:: safe_iterator_t < R > find_if ( R && r, Pred pred, Proj proj = Proj { } ) ;
(4) (ranges TS)
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < I, Proj >> Pred >

I find_if_not ( I first, S last, Pred pred, Proj proj = Proj { } ) ;
(5) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryPredicate < projected < ranges:: iterator_t < R > , Proj >> Pred >

ranges:: safe_iterator_t < R > find_if_not ( R && r, Pred pred, Proj proj = Proj { } ) ;
(6) (ranges TS)

Возвращает первый элемент в диапазоне [ first , last ) , удовлетворяющий определённым критериям:

1) find выполняет поиск элемента, чье проецируемое значение равно value (т.е., value == ranges:: invoke ( proj, * i ) ).
3) find_if ищет элемент, для спроецированного значения которого предикат p возвращает true (т.е., ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) ) ) равно true ).
5) find_if_not ищет элемент, для которого спроецированное значение предикат q возвращает false (т.е., ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) ) ) равно false ).
2,4,6) То же, что и (1,3,5) , но использует r в качестве исходного диапазона, как если бы использовались ranges:: begin ( r ) в качестве first и ranges:: end ( r ) в качестве last .

Несмотря на приведённые выше объявления, фактическое количество и порядок параметров шаблона для объявлений алгоритмов не определено. Таким образом, если при вызове алгоритма используются явные аргументы шаблона, программа, вероятно, является непереносимой.

Содержание

Параметры

first, last - диапазон элементов для проверки
r - диапазон элементов для проверки
value - значение для сравнения с проецируемыми элементами
pred - предикат для применения к проецируемым элементам
proj - проекция для применения к элементам

Возвращаемое значение

Итератор на первый элемент, удовлетворяющий условию. Если такой элемент не найден, возвращает итератор, который сравнивается равным с last .

Сложность

Не более last - first применений предиката и проекции.

Возможная реализация

Первая версия
template<InputIterator I, Sentinel<I> S, class T, class Proj = ranges::identity>
    requires IndirectRelation<ranges::equal_to<>, projected<I, Proj>, const T*>
I find(I first, S last, const T& value, Proj proj = Proj{})
{
    for (; first != last; ++first)
        if (ranges::invoke(proj, *first) == value)
            break;
    return first;
}
Вторая версия
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
I find_if(I first, S last, Pred pred, Proj proj = Proj{})
{
    for (; first != last; ++first)
        if (ranges::invoke(pred, ranges::invoke(proj, *first)))
            break;
    return first;
}
Третья версия
template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryPredicate<projected<I, Proj>> Pred>
I find_if_not(I first, S last, Pred pred, Proj proj = Proj{})
{
    for (; first != last; ++first)
        if (!ranges::invoke(pred, ranges::invoke(proj, *first)))
            break;
    return first;
}

Пример

Смотрите также

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