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

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


Define overload #1
template<forward_iterator I1, sentinel_for<I1> S1,
         forward_iterator I2, sentinel_for<I2> S2,
         class Pred = ranges::equal_to,
         class Proj1 = identity,
         class Proj2 = identity>
requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr subrange<I1>
    search(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
           Proj1 proj1 = {}, Proj2 proj2 = {});

Ищет в диапазоне [first1, last1] диапазон [first2, last2].
Example, possible implementation
Define overload #2
template<forward_range R1, forward_range R2,
         class Pred = ranges::equal_to,
         class Proj1 = identity,
         class Proj2 = identity>
requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
constexpr borrowed_subrange_t<R1>
    search(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {});

Ищет в диапазоне "r1"  диапазон "r2".
Example, possible implementation

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

Вернёт ranges::subrange содержащий пару iterator-sentinel определяющих начало и конец найденного диапазона.
Если такового не нашлось, вернёт  {last1, last1}.



Notes

  • Во избежание возврата из функции итератора ссылающегося на временный объект, будет возвращен объект std::ranges::dangling, если "r" rvalue.




Сложность

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



Examples


Example 1:
#include <iostream>
#include <algorithm>
#include <string>
namespace ranges = std::ranges;
using namespace std::string_literals;

template<class T, class U>
constexpr auto
func(T&& haystack, U&& needle)
{
    auto result = ranges::search(std::forward<T>(haystack), std::forward<T>(needle));
    if constexpr(std::is_same_v<decltype(result), std::ranges::dangling>)
    {
        return "haystack is an rvalue?";
    }
    else
        return result.empty() ?
                "No matches." :
                std::string_view{result.begin(), result.end()};
}


int main()
{
    std::string str1 = "abcdefghijk";
    std::string str2 = "def";
    std::cout << func(str1, str2) << std::endl;
    std::cout << func(std::move(str1), str2) << std::endl;
}





def
t is an rvalue?






Changelog

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


See also

TODO

This page was last modified on 2025-06-03