Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Defined in header <algorithm> | ||
(1) | ||
template<class InputIt,class T> typenamestd::iterator_traits<InputIt>::difference_type | (constexpr since C++20) (until C++26) | |
template<class InputIt,class T=typenamestd::iterator_traits <InputIt>::value_type> | (since C++26) | |
(2) | ||
template<class ExecutionPolicy,class ForwardIt,class T> typenamestd::iterator_traits<ForwardIt>::difference_type | (since C++17) (until C++26) | |
template<class ExecutionPolicy, class ForwardIt,class T=typenamestd::iterator_traits | (since C++26) | |
template<class InputIt,class UnaryPred> typenamestd::iterator_traits<InputIt>::difference_type | (3) | (constexpr since C++20) |
template<class ExecutionPolicy,class ForwardIt,class UnaryPred> typenamestd::iterator_traits<ForwardIt>::difference_type | (4) | (since C++17) |
Returns the number of elements in the range[
first,
last)
satisfying specific criteria.
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
Contents |
first, last | - | the pair of iterators defining therange of elements to examine |
value | - | the value to search for |
policy | - | theexecution policy to use |
p | - | unary predicate which returns true for the required elements. The expressionp(v) must be convertible tobool for every argument |
Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
-UnaryPred must meet the requirements ofPredicate. |
The number of iteratorsit in therange[
first,
last)
satisfying the following condition:
Given\(\scriptsize N\)N asstd::distance(first, last):
The overloads with a template parameter namedExecutionPolicy
report errors as follows:
ExecutionPolicy
is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined.For the number of elements in the range[
first,
last)
without any additional criteria, seestd::distance.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_algorithm_default_value_type | 202403 | (C++26) | List-initialization for algorithms(1,2) |
See also the implementations ofcount
inlibstdc++ andlibc++.
See also the implementations ofcount_if
inlibstdc++ andlibc++.
count (1) |
---|
template<class InputIt,class T=typenamestd::iterator_traits<InputIt>::value_type>typenamestd::iterator_traits<InputIt>::difference_type count(InputIt first, InputIt last,const T& value){typenamestd::iterator_traits<InputIt>::difference_type ret=0;for(; first!= last;++first)if(*first== value)++ret;return ret;} |
count_if (3) |
template<class InputIt,class UnaryPred>typenamestd::iterator_traits<InputIt>::difference_type count_if(InputIt first, InputIt last, UnaryPred p){typenamestd::iterator_traits<InputIt>::difference_type ret=0;for(; first!= last;++first)if(p(*first))++ret;return ret;} |
#include <algorithm>#include <array>#include <cassert>#include <complex>#include <iostream>#include <iterator> int main(){constexprstd::array v{1,2,3,4,4,3,7,8,9,10};std::cout<<"v: ";std::copy(v.cbegin(), v.cend(),std::ostream_iterator<int>(std::cout," "));std::cout<<'\n'; // Determine how many integers match a target value.for(constint target:{3,4,5}){constint num_items= std::count(v.cbegin(), v.cend(), target);std::cout<<"number: "<< target<<", count: "<< num_items<<'\n';} // Use a lambda expression to count elements divisible by 4.int count_div4= std::count_if(v.begin(), v.end(),[](int i){return i%4==0;});std::cout<<"numbers divisible by four: "<< count_div4<<'\n'; // A simplified version of `distance` with O(N) complexity:auto distance=[](auto first,auto last){return std::count_if(first, last,[](auto){returntrue;});}; static_assert(distance(v.begin(), v.end())==10); std::array<std::complex<double>,3> nums{{{4,2},{1,3},{4,2}}};#ifdef __cpp_lib_algorithm_default_value_type// T gets deduced making list-initialization possibleauto c= std::count(nums.cbegin(), nums.cend(),{4,2});#elseauto c= std::count(nums.cbegin(), nums.cend(),std::complex<double>{4,2});#endifassert(c==2);}
Output:
v: 1 2 3 4 4 3 7 8 9 10number: 3, count: 2number: 4, count: 2number: 5, count: 0numbers divisible by four: 3
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 283 | C++98 | T was required to beEqualityComparable, butthe value type of InputIt is not alwaysT | removed the requirement |
returns the distance between two iterators (function template)[edit] | |
(C++20)(C++20) | returns the number of elements satisfying specific criteria (algorithm function object)[edit] |