Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::ranges::find_end

      From cppreference.com
      <cpp‎ |algorithm‎ |ranges
       
       
      Algorithm library
      Constrained algorithms and algorithms on ranges(C++20)
      Constrained algorithms, e.g.ranges::copy,ranges::sort, ...
      Execution policies(C++17)
      Sorting and related operations
      Partitioning operations
      Sorting operations
      Binary search operations
      (on partitioned ranges)
      Set operations (on sorted ranges)
      Merge operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      (C++11)
      (C++17)
      Lexicographical comparison operations
      Permutation operations
      C library
      Numeric operations
      Operations on uninitialized memory
       
      Constrained algorithms
      All names in this menu belong to namespacestd::ranges
      Non-modifying sequence operations
      Modifying sequence operations
      Partitioning operations
      Sorting operations
      Binary search operations (on sorted ranges)
             
             
      Set operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      Permutation operations
      Fold operations
      Operations on uninitialized storage
      Return types
       
      Defined in header<algorithm>
      Call signature
      template<std::forward_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>
      requiresstd::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
      constexprranges::subrange<I1>
          find_end( I1 first1, S1 last1, I2 first2, S2 last2,

                    Pred pred={}, Proj1 proj1={}, Proj2 proj2={});
      (1)(since C++20)
      template<ranges::forward_range R1,ranges::forward_range R2,

               class Pred=ranges::equal_to,
               class Proj1=std::identity,
               class Proj2=std::identity>
      requiresstd::indirectly_comparable<ranges::iterator_t<R1>,
                                         ranges::iterator_t<R2>,
                                          Pred, Proj1, Proj2>
      constexprranges::borrowed_subrange_t<R1>
          find_end( R1&& r1, R2&& r2, Pred pred={},

                    Proj1 proj1={}, Proj2 proj2={});
      (2)(since C++20)
      1) Searches for thelast occurrence of the sequence[first2last2) in the range[first1last1), after projection withproj1 andproj2 respectively. The projected elements are compared using the binary predicatepred.
      2) Same as(1), but usesr1 as the first source range andr2 as the second source range, as if usingranges::begin(r1) asfirst1,ranges::end(r1) aslast1,ranges::begin(r2) asfirst2, andranges::end(r2) aslast2.

      The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:

      Contents

      [edit]Parameters

      first1, last1 - the iterator-sentinel pair defining therange of elements to examine (akahaystack)
      first2, last2 - the iterator-sentinel pair defining therange of elements to search for (akaneedle)
      r1 - the range of elements to examine (akahaystack)
      r2 - the range of elements to search for (akaneedle)
      pred - binary predicate to compare the elements
      proj1 - projection to apply to the elements in the first range
      proj2 - projection to apply to the elements in the second range

      [edit]Return value

      1)ranges::subrange<I1>{} value initialized with expression{i, i+(i== last1?0:ranges::distance(first2, last2))} that denotes the last occurrence of the sequence[first2last2) in range[first1last1) (after projections withproj1 andproj2). If[first2last2) is empty or if no such sequence is found, the return value is effectively initialized with{last1, last1}.
      2) Same as(1), except that the return type isranges::borrowed_subrange_t<R1>.

      [edit]Complexity

      At most\(\scriptsize S\cdot(N-S+1)\)S·(N-S+1) applications of the corresponding predicate and each projection, where\(\scriptsize S\)S isranges::distance(first2, last2) and\(\scriptsize N\)N isranges::distance(first1, last1) for(1), or\(\scriptsize S\)S isranges::distance(r2) and\(\scriptsize N\)N isranges::distance(r1) for(2).

      [edit]Notes

      An implementation can improve efficiency of the search if the input iterators modelstd::bidirectional_iterator by searching from the end towards the begin. Modelling thestd::random_access_iterator may improve the comparison speed. All this however does not change the theoretical complexity of the worst case.

      [edit]Possible implementation

      struct find_end_fn{template<std::forward_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>    requiresstd::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>constexprranges::subrange<I1>        operator()(I1 first1, S1 last1,                   I2 first2, S2 last2, Pred pred={},                   Proj1 proj1={}, Proj2 proj2={})const{if(first2== last2){auto last_it=ranges::next(first1, last1);return{last_it, last_it};}auto result=ranges::search(            std::move(first1), last1, first2, last2, pred, proj1, proj2); if(result.empty())return result; for(;;){auto new_result=ranges::search(std::next(result.begin()), last1, first2, last2, pred, proj1, proj2);if(new_result.empty())return result;else                result= std::move(new_result);}} template<ranges::forward_range R1,ranges::forward_range R2,class Pred=ranges::equal_to,class Proj1=std::identity,class Proj2=std::identity>    requiresstd::indirectly_comparable<ranges::iterator_t<R1>,ranges::iterator_t<R2>,                                        Pred, Proj1, Proj2>constexprranges::borrowed_subrange_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::end(r2),                       std::move(pred),                       std::move(proj1), std::move(proj2));}}; inlineconstexpr find_end_fn find_end{};

      [edit]Example

      Run this code
      #include <algorithm>#include <array>#include <cctype>#include <iostream>#include <ranges>#include <string_view> void print(constauto haystack,constauto needle){constauto pos=std::distance(haystack.begin(), needle.begin());std::cout<<"In\"";for(constauto c: haystack)std::cout<< c;std::cout<<"\" found\"";for(constauto c: needle)std::cout<< c;std::cout<<"\" at position ["<< pos<<".."<< pos+ needle.size()<<")\n"<<std::string(4+ pos,' ')<<std::string(needle.size(),'^')<<'\n';} int main(){usingnamespace std::literals;constexprauto secret{"password password word..."sv};constexprauto wanted{"password"sv}; constexprauto found1= std::ranges::find_end(        secret.cbegin(), secret.cend(), wanted.cbegin(), wanted.cend());    print(secret, found1); constexprauto found2= std::ranges::find_end(secret,"word"sv);    print(secret, found2); constauto found3= std::ranges::find_end(secret,"ORD"sv,[](constchar x,constchar y){// uses a binary predicatereturnstd::tolower(x)==std::tolower(y);});    print(secret, found3); constauto found4= std::ranges::find_end(secret,"SWORD"sv,{},{},[](char c){returnstd::tolower(c);});// projects the 2nd range    print(secret, found4);     static_assert(std::ranges::find_end(secret,"PASS"sv).empty());// => not found}

      Output:

      In "password password word..." found "password" at position [9..17)             ^^^^^^^^In "password password word..." found "word" at position [18..22)                      ^^^^In "password password word..." found "ord" at position [19..22)                       ^^^In "password password word..." found "sword" at position [12..17)                ^^^^^

      [edit]See also

      finds the last element satisfying specific criteria
      (algorithm function object)[edit]
      finds the first element satisfying specific criteria
      (algorithm function object)[edit]
      searches for any one of a set of elements
      (algorithm function object)[edit]
      finds the first two adjacent items that are equal (or satisfy a given predicate)
      (algorithm function object)[edit]
      searches for the first occurrence of a range of elements
      (algorithm function object)[edit]
      searches for the first occurrence of a number consecutive copies of an element in a range
      (algorithm function object)[edit]
      finds the last sequence of elements in a certain range
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/ranges/find_end&oldid=180453"

      [8]ページ先頭

      ©2009-2025 Movatter.jp