std::ranges::count_if() algorithm
- od C++20
- Simplified
- Detailed
// (1)
constexpr std::iter_difference_t<I>
count_if( I first, S last, Pred pred, Proj proj = {} );
// (2)
constexpr ranges::range_difference_t<R>
count_if( R&& r, Pred pred, Proj proj = {} );
The type of arguments are generic and have the following constraints:
I
-std::input_iterator
S
-std::sentinel_for<I>
R
-std::ranges::input_range
Pred
:- (1) -
std::indirect_unary_predicate<std::projected<I, Proj>>
- (2) -
std::projected<ranges::iterator_t<R>, Proj>>
- (1) -
P
- (none)
The Proj
template argument has a default type of std::identity
for all overloads.
// (1)
template<
std::input_iterator I,
std::sentinel_for<I> S,
std::indirect_unary_predicate<std::projected<I, Proj>> Pred
class Proj = std::identity
>
constexpr std::iter_difference_t<I>
count_if( I first, S last, Pred pred, Proj proj = {} );
// (2)
template<
ranges::input_range R,
std::indirect_unary_predicate<std::projected<I, Proj>> Pred
class Proj = std::identity
>
constexpr ranges::range_difference_t<R>
count_if( R&& r, Pred pred, Proj proj = {} );
Returns the number of elements in the given range that satisfy specific criteria.
- (1) Counts elements for which predicate
p
returnstrue
. - (2) Same as (1), but uses
r
as the source range, as if usingranges::begin(r)
asfirst
andranges::end(r)
aslast
.
The function-like entities described on this page are niebloids.
Parameters
first last | The range of elements to examine. |
r | The range of elements to examine. |
pred | Predicate to apply to the projected elements. |
proj | Projection to apply to the elements. |
Return value
- (1 - 2) The number of elements for which the predicate
p
holdstrue
.
Complexity
Given N
as ranges::distance(first, last)
:
- (1 - 2) exactly
N
calls top
and projections.
Exceptions
(none)
Possible implementation
ranges::count_if
Notes
If you want to obtain the number of elements in range [first
; last
) or r
, without any additional criteria, use ranges::distance
.
Examples
Main.cpp
#include <algorithm>
#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_if(v.begin(), v.end(), target1);
int num_items2 = ranges::count_if(v, target2);
std::cout << "number: " << target1 << " count_if: " << num_items1 << '\n';
std::cout << "number: " << target2 << " count_if: " << num_items2 << '\n';
// use a lambda expression to count_if elements divisible by 3.
int num_items3 = ranges::count_if_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_if elements divisible by 11.
int num_items11 = ranges::count_if_if(v, [](int i) {return i % 11 == 0;});
std::cout << "number divisible by eleven: " << num_items11 << '\n';
}
Output
number: 3 count_if: 2
number: 5 count_if: 0
number divisible by three: 3
number divisible by eleven: 0
This article originates from this CppReference page. It was likely altered for improvements or editors' preference. Click "Edit this page" to see all changes made to this document.
Hover to see the original license.
Hover to see the original license.