Namespaces
Variants

std::ranges::find_first_of

С ru.cppreference.net
 
 
Библиотека алгоритмов
Ограниченные алгоритмы и алгоритмы над диапазонами (C++20)
Ограниченные алгоритмы, например ranges::copy, ranges::sort, ...
Операции последовательности без изменения    
Пакетные операции
(C++17)
Операции поиска
Операции последовательности с изменением
Операции копирования
(C++11)
(C++11)
Операции обмена
Операции преобразования
Операции генерации
Операции удаления
Операции изменения порядка
(до C++17)(C++11)
(C++20)(C++20)
Операции выборки
(C++17)

Сортировка и связанные операции
Операции разделения
(C++11)    

Операции сортировки
Операции бинарного поиска
(на разделенных диапазонах)
Операции над множествами (на отсортированных диапазонах)
Операции слияния (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
(C++11)
(C++17)
Операции лексикографического сравнения
Операции перестановки


Политики выполнения (C++17)
(только для пояснения*)(C++26)

Численные операции
(C++11)
(C++17)
(C++17)    

Специализированные <memory> алгоритмы

Специализированные <random> алгоритмы
Библиотека C









 
Ограниченные алгоритмы
Все имена в этом меню принадлежат пространству имён std::ranges
Операции последовательности без изменения
Операции последовательности с изменением
Операции разделения
Операции сортировки
Операции бинарного поиска (на отсортированных диапазонах)
       
       
Операции над множествами (на отсортированных диапазонах)
Операции с кучей
Операции минимума/максимума
       
       
Операции перестановки
Операции свёртки
Операции над неинициализированной памятью
Типы возврата
 
Определён в заголовке <algorithm>
Сигнатура вызова
template< std::input_iterator I1, std::sentinel_for<I1> S1,
          std::forward_iterator I2, std::sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr I1
    find_first_of( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {} );
(1) (начиная с C++20)
template< ranges::input_range R1, ranges::forward_range R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
constexpr ranges::borrowed_iterator_t<R1>
    find_first_of( R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {} );
(2) (начиная с C++20)
template< /*execution-policy*/ Ep,
          std::random_access_iterator I1, std::sized_sentinel_for<I1> S1,
          std::random_access_iterator I2, std::sized_sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
I1 find_first_of( Ep&& policy, I1 first1, S1 last1, I2 first2, S2 last2,
                  Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {} );
(3) (начиная с C++26)
template< /*execution-policy*/ Ep,
          /*sized-random-access-range*/ R1,
          /*sized-random-access-range*/ R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
ranges::borrowed_iterator_t<R1>
    find_first_of( Ep&& policy, R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {} );
(4) (начиная с C++26)

Определение /*execution-policy*/ см. на этой странице; определение /*sized-random-access-range*/ см. на этой странице.

Ищет исходный диапазон на наличие любого из элементов в целевом диапазоне. Элементы (спроецированные с помощью proj1 и proj2 соответственно) сравниваются с использованием бинарного предиката pred.

1) Исходный диапазон — это [first1, last1), а целевой диапазон — это [first2, last2).
2) Исходный диапазон — это r1, а целевой диапазон — это r2.
3,4) То же, что и (1,2), но выполняется в соответствии с policy.

Функциональные объекты, описанные на этой странице, являются объектами функций алгоритмов (неформально известными как niebloids), то есть:

Параметры

first1, last1 - пара итератор-сигнал, определяющая исходный диапазон
first2, last2 - пара итератор-сигнал, определяющая целевой диапазон
r1 - исходный диапазон
r2 - целевой диапазон
pred - предикат, применяемый к (спроецированным) элементам
proj1 - проекция, применяемая к элементам исходного диапазона
proj2 - проекция, применяемая к элементам целевого диапазона
policy - используемая execution policy

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

Итератор на первый элемент в исходном диапазоне, который соответствует элементу из целевого диапазона.

Если целевой диапазон пуст или такой элемент не найден, возвращается:

1,3) last1
2,4) ranges::next(ranges::begin(r1), ranges::end(r1))

Сложность

Пусть N1 как ranges::distance(first1, last1) или ranges::distance(r1), и N2 как ranges::distance(first2, last2) или ranges::distance(r2):

1,2) Не более N1⋅N2 применений pred и proj.
3,4) 𝓞(N1⋅N2) применений pred и proj.

Исключения

3,4) Во время выполнения процесса:
  • Если временные ресурсы памяти, необходимые для распараллеливания, недоступны, std::bad_alloc выбрасывается.
  • Если неперехваченное исключение выбрасывается при доступе к объектам через аргумент алгоритма, поведение определяется политикой выполнения (для стандартных политик вызывается std::terminate).

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

struct find_first_of_fn
{
    template<std::input_iterator I1, std::sentinel_for<I1> S1,
             std::forward_iterator I2, std::sentinel_for<I2> S2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
        requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
    constexpr I1 operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                            Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        for (; first1 != last1; ++first1)
            for (auto i = first2; i != last2; ++i)
                if (std::invoke(pred, std::invoke(proj1, *first1), std::invoke(proj2, *i)))
                    return first1;
        return first1;
    }
    
    template<ranges::input_range R1, ranges::forward_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
    constexpr ranges::borrowed_iterator_t<R1>
        operator()(R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1), ranges::end(r1),
                       ranges::begin(r2),
                       ranges::next(ranges::begin(r2), ranges::end(r2)),
                       std::move(pred), std::move(proj1), std::move(proj2));
    }
    
    template<ranges::forward_range R1, ranges::forward_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
    constexpr ranges::borrowed_iterator_t<R1>
        operator()(R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1),
                       ranges::next(ranges::begin(r1), ranges::end(r1)),
                       ranges::begin(r2),
                       ranges::next(ranges::begin(r2), ranges::end(r2)),
                       std::move(pred), std::move(proj1), std::move(proj2));
    }
};

inline constexpr find_first_of_fn find_first_of{};

Пример

#include <algorithm>
#include <iostream>
#include <iterator>

int main()
{
    using std::ranges::find_first_of;
    
    constexpr static auto haystack = {1, 2, 3, 4};
    constexpr static auto needles  = {0, 3, 4, 3};
    
    constexpr auto found1 = find_first_of(haystack.begin(), haystack.end(),
                                          needles.begin(), needles.end());
    static_assert(std::distance(haystack.begin(), found1) == 2);
    
    constexpr auto found2 = find_first_of(haystack, needles);
    static_assert(std::distance(haystack.begin(), found2) == 2);
    
    constexpr static auto negatives = {-6, -3, -4, -3};
    constexpr auto not_found = find_first_of(haystack, negatives);
    static_assert(not_found == haystack.end());
    
    constexpr auto found3 = find_first_of(haystack, negatives,
        [](int x, int y) { return x == -y; }); // uses a binary comparator
    static_assert(std::distance(haystack.begin(), found3) == 2);
    
    struct P { int x, y; };
    constexpr static auto p1 = {P{1, -1}, P{2, -2}, P{3, -3}, P{4, -4}};
    constexpr static auto p2 = {P{5, -5}, P{6, -3}, P{7, -5}, P{8, -3}};
    
    // Compare only P::y data members by projecting them:
    const auto found4 = find_first_of(p1, p2, {}, &P::y, &P::y);
    std::cout << "First equivalent element {" << found4->x << ", " << found4->y
              << "} was found at position " << std::distance(p1.begin(), found4)
              << ".\n";
}

Вывод:

First equivalent element {3, -3} was found at position 2.

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

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