@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com
std::ranges::find
Актуально для C++26.

#include <algorithm>
Актуально на 2025-05-18.


Define overload #1
template<std::input_iterator I, std::sentinel_for<I> S, class Proj = std::identity, class T = std::projected_value_t<I, Proj>>
requires std::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>, const T*>
constexpr I find(I first, S last, const T& value, Proj proj = {});

Ищет в  диапазоне [first, last] значение "value".
Example, possible implementation
Define overload #2
template<ranges::input_range R, class Proj = std::identity, class T = std::projected_value_t<ranges::iterator_t<R>, Proj>>
requires std::indirect_binary_predicate<ranges::equal_to, std::projected<ranges::iterator_t<R>, Proj>, const T*>
constexpr ranges::borrowed_iterator_t<R>
find(R&& r, const T& value, Proj proj = {});

Ищет в диапазоне "r" значение "value".
Example, possible implementation

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

Вернёт итератор на первый найденный элемент или "last", если такого элемента не нашлось.



Notes

  • Поиск выполняется последовательным перебором, начиная с позиции "first".




Сложность

Линейная - O(n).



Examples


Example 1:
#include <iostream>
#include <string>
#include <algorithm>

namespace ranges = std::ranges;

int main()
{
    std::string str = "hello world!";
    auto find_it = ranges::find(str, 'w');
    if (find_it != std::end(str))
    {
        std::cout << std::string_view(find_it, std::end(str)) << std::endl;
    }
    else
    {
        std::cout << "Нет такой буквы!" << std::endl;
    }
    return 0;
}



world!






Changelog

C++26
Изменены параметры шаблонов функций (#1 и #2).
В предыдущих редакциях, перегрузка #1 имела следующий шаблон функции:
template<std::input_iterator I, std::sentinel_for<I> S,class T, class Proj = std::identity>
requires std::indirect_binary_predicate<ranges::equal_to, std::projected<I, Proj>, const T*>
constexpr I find(I first, S last, const T& value, Proj proj = {});


перегрузка #2:
template<ranges::input_range R, class T, class Proj = std::identity>
requires std::indirect_binary_predicate<ranges::equal_to, std::projected<ranges::iterator_t<R>, Proj>, const T*>
constexpr ranges::borrowed_iterator_t<R>
find(R&& r, const T& value, Proj proj = {});

C++20
Введён в стандарт.


See also

TODO

This page was last modified on 2025-05-18