table of contents
        
      
      
    | std::experimental::ranges::search_n(3) | C++ Standard Libary | std::experimental::ranges::search_n(3) | 
NAME¶
std::experimental::ranges::search_n - std::experimental::ranges::search_n
Synopsis¶
 Defined in header <experimental/ranges/algorithm>
  
   template< ForwardIterator I, Sentinel<I> S, class T,
  
   class Pred = ranges::equal_to<>, class Proj = ranges::identity >
  
   requires IndirectlyComparable<I, const T*, Pred, Proj> (1)
    (ranges TS)
  
   I search_n(I first, S last, ranges::difference_type_t<I> count,
  
   const T& value, Pred pred = Pred{}, Proj proj = Proj{});
  
   template< ForwardRange R, class T, class Pred =
  ranges::equal_to<>,
  
   class Proj = ranges::identity >
  
   requires IndirectlyComparable<ranges::iterator_t<R>, const T*, Pred,
  
   Proj> (2) (ranges TS)
  
   ranges::safe_iterator_t<R> search_n(R&& r,
  
   ranges::difference_type_t<ranges::iterator_t<R>> count,
  
   const T& value, Pred pred = Pred{}, Proj proj = Proj{});
  
   1) Searches the range [first, last) for the first sequence of count elements
    whose
  
   projected values are each equal to the given value value according to the
    predicate
  
   pred.
  
   2) Same as (1), but uses r as the source range, as if using
    ranges::begin(r) as
  
   first and ranges::end(r) as last.
Parameters¶
 first, last - the range of elements to examine
  
   r - the range of elements to examine
  
   count - the length of the sequence to search for
  
   value - the value to search for
  
   pred - the predicate that compares the projected elements with value
  
   proj - the projection to apply to the elements
Return value¶
 Iterator to the beginning of the found sequence in the range
    [first, last). If no
  
   such sequence is found, an iterator that compares equal to last is
  returned.
Complexity¶
At most last - first applications of the predicate and the projection.
Possible implementation¶
 template< ForwardIterator I, Sentinel<I> S, class T,
  
   class Pred = ranges::equal_to<>, class Proj = ranges::identity >
  
   requires IndirectlyComparable<I, const T*, Pred, Proj>
  
   I search_n(I first, S last, ranges::difference_type_t<I> count,
  
   const T& value, Pred pred = Pred{}, Proj proj = Proj{})
  
   {
  
   for(; first != last; ++first) {
  
   if (!ranges::invoke(pred, ranges::invoke(proj, *first), value)) {
  
   continue;
  
   }
  
   I candidate = first;
  
   ranges::difference_type_t<I> cur_count = 0;
  
   while (true) {
  
   ++cur_count;
  
   if (cur_count == count) {
  
   // success
  
   return candidate;
  
   }
  
   ++first;
  
   if (first == last) {
  
   // exhausted the list
  
   return first;
  
   }
  
   if (!ranges::invoke(pred, ranges::invoke(proj, *first), value)) {
  
   // too few in a row
  
   break;
  
   }
  
   }
  
   }
  
   return first;
  
   }
Example¶
 This section is incomplete
  
   Reason: no example
See also¶
 search_n searches a range for a number of consecutive copies of
    an element
  
   (function template)
  
   find_end finds the last sequence of elements in a certain range
  
   (function template)
  
   find finds the first element satisfying specific criteria
  
   find_if (function template)
  
   find_if_not
  
   search searches for a range of elements
  
   (function template)
| 2022.07.31 | http://cppreference.com |