Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::ranges::find_first_of

      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::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>
      requiresstd::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)(since C++20)
      template<ranges::input_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_iterator_t<R1>
          find_first_of( R1&& r1, R2&& r2, Pred pred={},

                         Proj1 proj1={}, Proj2 proj2={});
      (2)(since C++20)
      1) Searches the range[first1last1) forany of the elements in the range[first2last2), after projecting the ranges 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 (akaneedles)
      r1 - the range of elements to examine (akahaystack)
      r2 - the range of elements to search for (akaneedles)
      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

      Iterator to the first element in the range[first1last1) that is equal to an element from the range[first2last2) after projection. If no such element is found, an iterator comparing equal tolast1 is returned.

      [edit]Complexity

      At mostS* N applications of the predicate and each projection, where
      (1)S=ranges::distance(first2, last2) andN=ranges::distance(first1, last1);
      (2)S=ranges::distance(r2) andN=ranges::distance(r1).

      [edit]Possible implementation

      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>    requiresstd::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>    requiresstd::indirectly_comparable<ranges::iterator_t<R1>,ranges::iterator_t<R2>,                                        Pred, Proj1, Proj2>constexprranges::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::end(r2),                       std::move(pred), std::move(proj1), std::move(proj2));}}; inlineconstexpr find_first_of_fn find_first_of{};

      [edit]Example

      Run this code
      #include <algorithm>#include <iostream>#include <iterator> int main(){namespace rng= std::ranges; constexprstaticauto haystack={1,2,3,4};constexprstaticauto needles={0,3,4,3}; constexprauto found1= rng::find_first_of(haystack.begin(), haystack.end(),                                               needles.begin(), needles.end());    static_assert(std::distance(haystack.begin(), found1)==2); constexprauto found2= rng::find_first_of(haystack, needles);    static_assert(std::distance(haystack.begin(), found2)==2); constexprstaticauto negatives={-6,-3,-4,-3};constexprauto not_found= rng::find_first_of(haystack, negatives);    static_assert(not_found== haystack.end()); constexprauto found3= rng::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;};constexprstaticauto p1={P{1,-1}, P{2,-2}, P{3,-3}, P{4,-4}};constexprstaticauto p2={P{5,-5}, P{6,-3}, P{7,-5}, P{8,-3}}; // Compare only P::y data members by projecting them:constauto found4= rng::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";}

      Output:

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

      [edit]See also

      searches for any one of a set of elements
      (function template)[edit]
      finds the first two adjacent items that are equal (or satisfy a given predicate)
      (algorithm function object)[edit]
      finds the first element satisfying specific criteria
      (algorithm function object)[edit]
      finds the last sequence of elements in a certain range
      (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]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/ranges/find_first_of&oldid=180454"

      [8]ページ先頭

      ©2009-2025 Movatter.jp