std::ranges:: count, std::ranges:: count_if
| 
           Defined in header
            
            
             <algorithm>
            
            | ||
| 
           Call signature
           | ||
| (1) | ||
| 
           
           
           
            
             template
            
            
             <
            
            
             
              std::
              
               input_iterator
              
             
            
            I,
            
             
              std::
              
               sentinel_for
              
             
            
            
             <
            
            I
            
             >
            
            S,
             
             
              class
             
             T,
             
              class
             
             Proj
             
              =
             
             
              
               std::
               
                identity
               
              
             
             
              >
             
              | (since C++20) (until C++26) | |
| 
           
            
             template
            
            
             <
            
            
             
              std::
              
               input_iterator
              
             
            
            I,
            
             
              std::
              
               sentinel_for
              
             
            
            
             <
            
            I
            
             >
            
            S,
             
             
              class
             
             Proj
             
              =
             
             
              
               std::
               
                identity
               
              
             
             ,
              | (since C++26) | |
| (2) | ||
| 
           
            
             template
            
            
             <
            
            
             
              ranges::
              
               input_range
              
             
            
            R,
            
             class
            
            T,
            
             class
            
            Proj
            
             =
            
            
             
              std::
              
               identity
              
             
            
            
             >
            
             
             requires
             
              
               std::
               
                indirect_binary_predicate
               
              
             
              | (since C++20) (until C++26) | |
| 
           
            
             template
            
            
             <
            
            
             
              ranges::
              
               input_range
              
             
            
            R,
            
             class
            
            Proj
            
             =
            
            
             
              std::
              
               identity
              
             
            
            ,
             
             
              class
             
             T
             
              =
             
             std
             
              ::
             
             
              projected_value_t
             
             
              <
             
             
              
               ranges::
               
                iterator_t
               
              
             
             
              <
             
             R
             
              >
             
             , Proj
             
              >
             
             
              >
             
              | (since C++26) | |
| 
           
           
           
            
             template
            
            
             <
            
            
             
              std::
              
               input_iterator
              
             
            
            I,
            
             
              std::
              
               sentinel_for
              
             
            
            
             <
            
            I
            
             >
            
            S,
             
             
              class
             
             Proj
             
              =
             
             
              
               std::
               
                identity
               
              
             
             ,
              | (3) | (since C++20) | 
| 
           
            
             template
            
            
             <
            
            
             
              ranges::
              
               input_range
              
             
            
            R,
            
             class
            
            Proj
            
             =
            
            
             
              std::
              
               identity
              
             
            
            ,
             
             
              
               std::
               
                indirect_unary_predicate
               
              
             
             
              <
             
              | (4) | (since C++20) | 
       Returns the number of elements in the range
       
        
         [
        
        
         
          first
         
        
        
         ,
        
        
         
          last
         
        
        
         )
        
       
       satisfying specific criteria.
      
The function-like entities described on this page are algorithm function objects (informally known as niebloids ), that is:
- Explicit template argument lists cannot be specified when calling any of them.
- None of them are visible to argument-dependent lookup .
- When any of them are found by normal unqualified lookup as the name to the left of the function-call operator, argument-dependent lookup is inhibited.
Parameters
| first, last | - | the range of elements to examine | 
| r | - | the range of the elements to examine | 
| value | - | the value to search for | 
| pred | - | predicate to apply to the projected elements | 
| proj | - | projection to apply to the elements | 
Return value
Number of elements satisfying the condition.
Complexity
Exactly last - first comparisons and projection.
Notes
For the number of elements in the range without any additional criteria, see std::ranges::distance .
| Feature-test macro | Value | Std | Feature | 
|---|---|---|---|
| 
           __cpp_lib_algorithm_default_value_type
           | 202403 | (C++26) | List-initialization for algorithms ( 1,2 ) | 
Possible implementation
| count (1) | 
|---|
| struct count_fn { 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 std::iter_difference_t<I> operator()(I first, S last, const T& value, Proj proj = {}) const { std::iter_difference_t<I> counter = 0; for (; first != last; ++first) if (std::invoke(proj, *first) == value) ++counter; return counter; } 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::range_difference_t<R> operator()(R&& r, const T& value, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), value, std::ref(proj)); } }; inline constexpr count_fn count; | 
| count_if (3) | 
| struct count_if_fn { template<std::input_iterator I, std::sentinel_for<I> S, class Proj = std::identity, std::indirect_unary_predicate<std::projected<I, Proj>> Pred> constexpr std::iter_difference_t<I> operator()(I first, S last, Pred pred, Proj proj = {}) const { std::iter_difference_t<I> counter = 0; for (; first != last; ++first) if (std::invoke(pred, std::invoke(proj, *first))) ++counter; return counter; } template<ranges::input_range R, class Proj = std::identity, std::indirect_unary_predicate< std::projected<ranges::iterator_t<R>, Proj>> Pred> constexpr ranges::range_difference_t<R> operator()(R&& r, Pred pred, Proj proj = {}) const { return (*this)(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj)); } }; inline constexpr count_if_fn count_if; | 
Example
#include <algorithm> #include <cassert> #include <complex> #include <iostream> #include <vector> int main() { std::vector<int> v{1, 2, 3, 4, 4, 3, 7, 8, 9, 10}; namespace ranges = std::ranges; // determine how many integers in a std::vector match a target value. int target1 = 3; int target2 = 5; int num_items1 = ranges::count(v.begin(), v.end(), target1); int num_items2 = ranges::count(v, target2); std::cout << "number: " << target1 << " count: " << num_items1 << '\n'; std::cout << "number: " << target2 << " count: " << num_items2 << '\n'; // use a lambda expression to count elements divisible by 3. int num_items3 = ranges::count_if(v.begin(), v.end(), [](int i){ return i % 3 == 0; }); std::cout << "number divisible by three: " << num_items3 << '\n'; // use a lambda expression to count elements divisible by 11. int num_items11 = ranges::count_if(v, [](int i){ return i % 11 == 0; }); std::cout << "number divisible by eleven: " << num_items11 << '\n'; std::vector<std::complex<double>> nums{{4, 2}, {1, 3}, {4, 2}}; #ifdef __cpp_lib_algorithm_default_value_type auto c = ranges::count(nums, {4, 2}); #else auto c = ranges::count(nums, std::complex<double>{4, 2}); #endif assert(c == 2); }
Output:
number: 3 count: 2 number: 5 count: 0 number divisible by three: 3 number divisible by eleven: 0
See also
| 
           
            
             
              (C++20)
             
            
           
           | returns the distance between an iterator and a sentinel, or between the beginning and end of a range (algorithm function object) | 
| 
           
            
             
              (C++20)
             
            
           
           | creates a subrange from an iterator and a count (customization point object) | 
| a 
           view
          that consists of the elements of a
           range
          that satisfies a predicate(class template) (range adaptor object) | |
| returns the number of elements satisfying specific criteria (function template) |