Difference between revisions of "cpp/algorithm/all any none of"
From cppreference.com
m |
(Wording update.) |
||
(41 intermediate revisions by 17 users not shown) | |||
Line 1: | Line 1: | ||
− | {{cpp/title| all_of | any_of | none_of}} | + | {{cpp/title|all_of|any_of|none_of}} |
− | {{cpp/algorithm/ | + | {{cpp/algorithm/navbar}} |
− | {{ | + | {{dcl begin}} |
− | {{ | + | {{dcl header|algorithm}} |
− | {{ | + | {{dcla|num=1|since=c++11|notes={{mark constexpr since c++20}}| |
− | template< class | + | template< class InputIt, class UnaryPred > |
− | bool all_of( | + | bool all_of( InputIt first, InputIt last, UnaryPred p ); |
}} | }} | ||
− | {{ | + | {{dcl|since=c++17|num=2| |
− | template< class | + | template< class ExecutionPolicy, class ForwardIt, class UnaryPred > |
− | bool | + | bool all_of( ExecutionPolicy&& policy, |
+ | ForwardIt first, ForwardIt last, UnaryPred p ); | ||
}} | }} | ||
− | {{ | + | {{dcla|num=3|since=c++11|notes={{mark constexpr since c++20}}| |
− | template< class | + | template< class InputIt, class UnaryPred > |
− | bool | + | bool any_of( InputIt first, InputIt last, UnaryPred p ); |
}} | }} | ||
− | {{ | + | {{dcl|num=4|since=c++17| |
+ | template< class ExecutionPolicy, class ForwardIt, class UnaryPred > | ||
+ | bool any_of( ExecutionPolicy&& policy, | ||
+ | ForwardIt first, ForwardIt last, UnaryPred p ); | ||
+ | }} | ||
+ | {{dcla|num=5|since=c++11|notes={{mark constexpr since c++20}}| | ||
+ | template< class InputIt, class UnaryPred > | ||
+ | bool none_of( InputIt first, InputIt last, UnaryPred p ); | ||
+ | }} | ||
+ | {{dcl|num=6|since=c++17| | ||
+ | template< class ExecutionPolicy, class ForwardIt, class UnaryPred > | ||
+ | bool none_of( ExecutionPolicy&& policy, | ||
+ | ForwardIt first, ForwardIt last, UnaryPred p ); | ||
+ | }} | ||
+ | {{dcl end}} | ||
+ | |||
+ | @1@ Checks if unary predicate {{c|p}} returns {{c|true}} for all elements in the range {{range|first|last}}. | ||
− | + | @3@ Checks if unary predicate {{c|p}} returns {{c|true}} for at least one element in the range {{range|first|last}}. | |
− | + | @5@ Checks if unary predicate {{c|p}} returns {{c|true}} for no elements in the range {{range|first|last}}. | |
− | + | @2,4,6@ Same as {{v|1,3,5}}, but executed according to {{c|policy}}. | |
+ | @@ {{cpp/algorithm/parallel overload precondition|plural=true}} | ||
===Parameters=== | ===Parameters=== | ||
− | {{ | + | {{par begin}} |
− | {{ | + | {{par|first, last|the range of elements to examine}} |
− | {{ | + | {{par exec pol}} |
− | {{ | + | {{par pred1|p|p1=InputIt}} |
+ | {{par hreq}} | ||
+ | {{par req named|InputIt|InputIterator}} | ||
+ | {{par req named|ForwardIt|ForwardIterator}} | ||
+ | {{par req named|UnaryPred|Predicate}} | ||
+ | {{par end}} | ||
===Return value=== | ===Return value=== | ||
− | + | {|class="wikitable" style="text-align: center;" | |
− | + | !Has {{c|true}} element | |
− | + | !colspan=2|Yes | |
− | + | !colspan=2|No | |
− | + | |- | |
− | + | !{{nbsp}}Has {{c|false}} element{{nbsp}} | |
+ | !Yes | ||
+ | !No | ||
+ | !Yes | ||
+ | !No | ||
+ | |- | ||
+ | |{{tt|all_of}} | ||
+ | |{{c|false}} | ||
+ | |{{c|true}} | ||
+ | |{{c|false}} | ||
+ | |{{c|true}} | ||
+ | |- | ||
+ | |{{tt|any_of}} | ||
+ | |{{c|true}} | ||
+ | |{{c|true}} | ||
+ | |{{nbsp|2}}{{c|false}}{{nbsp|2}} | ||
+ | |{{nbsp|2}}{{c|false}}{{nbsp|2}} | ||
+ | |- | ||
+ | |{{tt|none_of}} | ||
+ | |{{nbsp|2}}{{c|false}}{{nbsp|2}} | ||
+ | |{{nbsp|2}}{{c|false}}{{nbsp|2}} | ||
+ | |{{c|true}} | ||
+ | |{{c|true}} | ||
+ | |} | ||
===Complexity=== | ===Complexity=== | ||
+ | @1-6@ At most {{c|std::distance(first, last)}} applications of the predicate {{c|p}}. | ||
− | + | ===Exceptions=== | |
+ | {{cpp/algorithm/parallel exceptions reporting behavior|singular=no}} | ||
===Possible implementation=== | ===Possible implementation=== | ||
− | {{eq | + | See also the implementations of |
− | template< class | + | * {{tt|all_of}} in [https://github.com/gcc-mirror/gcc/blob/d9375e490072d1aae73a93949aa158fcd2a27018/libstdc%2B%2B-v3/include/bits/stl_algo.h#L508 libstdc++] and [https://github.com/llvm-mirror/libcxx/blob/a12cb9d211019d99b5875b6d8034617cbc24c2cc/include/algorithm#L838 libc++]. |
− | bool all_of( | + | * {{tt|any_of}} in [https://github.com/gcc-mirror/gcc/blob/d9375e490072d1aae73a93949aa158fcd2a27018/libstdc%2B%2B-v3/include/bits/stl_algo.h#L541 libstdc++] and [https://github.com/llvm-mirror/libcxx/blob/a12cb9d211019d99b5875b6d8034617cbc24c2cc/include/algorithm#L852 libc++]. |
+ | * {{tt|none_of}} in [https://github.com/gcc-mirror/gcc/blob/d9375e490072d1aae73a93949aa158fcd2a27018/libstdc%2B%2B-v3/include/bits/stl_algo.h#L523 libstdc++] and [https://github.com/llvm-mirror/libcxx/blob/a12cb9d211019d99b5875b6d8034617cbc24c2cc/include/algorithm#L866 libc++]. | ||
+ | {{eq impl | ||
+ | |title1=all_of|ver1=1|1= | ||
+ | template<class InputIt, class UnaryPred> | ||
+ | constexpr bool all_of(InputIt first, InputIt last, UnaryPred p) | ||
{ | { | ||
− | + | return std::find_if_not(first, last, p) == last; | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | |title2=any_of|ver2=3|2= | |
− | template< class | + | template<class InputIt, class UnaryPred> |
− | bool any_of( | + | constexpr bool any_of(InputIt first, InputIt last, UnaryPred p) |
{ | { | ||
− | + | return std::find_if(first, last, p) != last; | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
− | + | |title3=none_of|ver3=5|3= | |
− | template< class | + | template<class InputIt, class UnaryPred> |
− | bool none_of( | + | constexpr bool none_of(InputIt first, InputIt last, UnaryPred p) |
{ | { | ||
− | + | return std::find_if(first, last, p) == last; | |
− | + | ||
− | + | ||
− | + | ||
} | } | ||
}} | }} | ||
Line 73: | Line 117: | ||
===Example=== | ===Example=== | ||
{{example | {{example | ||
− | + | |code= | |
− | + | ||
#include <algorithm> | #include <algorithm> | ||
− | |||
− | |||
#include <functional> | #include <functional> | ||
+ | #include <iostream> | ||
+ | #include <iterator> | ||
+ | #include <numeric> | ||
+ | #include <vector> | ||
int main() | int main() | ||
Line 86: | Line 131: | ||
std::cout << "Among the numbers: "; | std::cout << "Among the numbers: "; | ||
std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " ")); | std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " ")); | ||
− | std::cout << | + | std::cout << '\n'; |
− | + | ||
− | if (std::all_of(v.cbegin(), v.cend(), [](int i){ return i % 2 == 0; })) | + | if (std::all_of(v.cbegin(), v.cend(), [](int i) { return i % 2 == 0; })) |
− | std::cout << "All numbers are even" | + | std::cout << "All numbers are even\n"; |
− | + | ||
− | if (std::none_of(v.cbegin(), v.cend(), std::bind(std::modulus< | + | if (std::none_of(v.cbegin(), v.cend(), std::bind(std::modulus<>(), |
− | std::placeholders::_1, 2))) | + | std::placeholders::_1, 2))) |
− | std::cout << "None of them are odd" | + | std::cout << "None of them are odd\n"; |
− | + | ||
struct DivisibleBy | struct DivisibleBy | ||
{ | { | ||
Line 101: | Line 146: | ||
bool operator()(int n) const { return n % d == 0; } | bool operator()(int n) const { return n % d == 0; } | ||
}; | }; | ||
− | + | ||
− | if (std::any_of(v.cbegin(), v.cend(), DivisibleBy(7))) | + | if (std::any_of(v.cbegin(), v.cend(), DivisibleBy(7))) |
− | std::cout << "At least one number is divisible by 7" | + | std::cout << "At least one number is divisible by 7\n"; |
− | + | ||
} | } | ||
− | + | |output=Among the numbers: 2 4 6 8 10 12 14 16 18 20 | |
All numbers are even | All numbers are even | ||
None of them are odd | None of them are odd | ||
Line 112: | Line 156: | ||
}} | }} | ||
− | + | ===See also=== | |
+ | {{dsc begin}} | ||
+ | {{dsc inc|cpp/algorithm/ranges/dsc all_any_none_of}} | ||
+ | {{dsc end}} | ||
+ | |||
+ | {{langlinks|de|es|fr|it|ja|pt|ru|zh}} |
Latest revision as of 01:47, 19 March 2024
Defined in header <algorithm>
|
||
template< class InputIt, class UnaryPred > bool all_of( InputIt first, InputIt last, UnaryPred p ); |
(1) | (since C++11) (constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred > bool all_of( ExecutionPolicy&& policy, |
(2) | (since C++17) |
template< class InputIt, class UnaryPred > bool any_of( InputIt first, InputIt last, UnaryPred p ); |
(3) | (since C++11) (constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred > bool any_of( ExecutionPolicy&& policy, |
(4) | (since C++17) |
template< class InputIt, class UnaryPred > bool none_of( InputIt first, InputIt last, UnaryPred p ); |
(5) | (since C++11) (constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt, class UnaryPred > bool none_of( ExecutionPolicy&& policy, |
(6) | (since C++17) |
1) Checks if unary predicate p returns true for all elements in the range
[
first,
last)
.3) Checks if unary predicate p returns true for at least one element in the range
[
first,
last)
.5) Checks if unary predicate p returns true for no elements in the range
[
first,
last)
.2,4,6) Same as (1,3,5), but executed according to policy.
These overloads participate in overload resolution only if
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true. |
(until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. |
(since C++20) |
Contents |
[edit] Parameters
first, last | - | the range of elements to examine |
policy | - | the execution policy to use. See execution policy for details. |
p | - | unary predicate . The expression p(v) must be convertible to bool for every argument |
Type requirements | ||
-InputIt must meet the requirements of LegacyInputIterator.
| ||
-ForwardIt must meet the requirements of LegacyForwardIterator.
| ||
-UnaryPred must meet the requirements of Predicate.
|
[edit] Return value
Has true element | Yes | No | ||
---|---|---|---|---|
Has false element | Yes | No | Yes | No |
all_of
|
false | true | false | true |
any_of
|
true | true | false | false |
none_of
|
false | false | true | true |
[edit] Complexity
[edit] Exceptions
The overloads with a template parameter named ExecutionPolicy
report errors as follows:
- If execution of a function invoked as part of the algorithm throws an exception and
ExecutionPolicy
is one of the standard policies, std::terminate is called. For any otherExecutionPolicy
, the behavior is implementation-defined. - If the algorithm fails to allocate memory, std::bad_alloc is thrown.
[edit] Possible implementation
See also the implementations of
all_of |
---|
template<class InputIt, class UnaryPred> constexpr bool all_of(InputIt first, InputIt last, UnaryPred p) { return std::find_if_not(first, last, p) == last; } |
any_of |
template<class InputIt, class UnaryPred> constexpr bool any_of(InputIt first, InputIt last, UnaryPred p) { return std::find_if(first, last, p) != last; } |
none_of |
template<class InputIt, class UnaryPred> constexpr bool none_of(InputIt first, InputIt last, UnaryPred p) { return std::find_if(first, last, p) == last; } |
[edit] Example
Run this code
#include <algorithm> #include <functional> #include <iostream> #include <iterator> #include <numeric> #include <vector> int main() { std::vector<int> v(10, 2); std::partial_sum(v.cbegin(), v.cend(), v.begin()); std::cout << "Among the numbers: "; std::copy(v.cbegin(), v.cend(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; if (std::all_of(v.cbegin(), v.cend(), [](int i) { return i % 2 == 0; })) std::cout << "All numbers are even\n"; if (std::none_of(v.cbegin(), v.cend(), std::bind(std::modulus<>(), std::placeholders::_1, 2))) std::cout << "None of them are odd\n"; struct DivisibleBy { const int d; DivisibleBy(int n) : d(n) {} bool operator()(int n) const { return n % d == 0; } }; if (std::any_of(v.cbegin(), v.cend(), DivisibleBy(7))) std::cout << "At least one number is divisible by 7\n"; }
Output:
Among the numbers: 2 4 6 8 10 12 14 16 18 20 All numbers are even None of them are odd At least one number is divisible by 7
[edit] See also
(C++20)(C++20)(C++20) |
checks if a predicate is true for all, any or none of the elements in a range (niebloid) |