std::experimental::ranges::all_of, std::experimental::ranges::any_of, std::experimental::ranges::none_of
来自cppreference.com
< cpp | experimental | ranges
template< InputIterator I, Sentinel<I> S, class Proj =ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred > | (1) | (范围 TS) |
template< InputRange R, class Proj =ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred > | (2) | (范围 TS) |
template< InputIterator I, Sentinel<I> S, class Proj =ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred > | (3) | (范围 TS) |
template< InputRange R, class Proj =ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred > | (4) | (范围 TS) |
template< InputIterator I, Sentinel<I> S, class Proj = identity, IndirectUnaryPredicate<projected<I, Proj>> Pred > | (5) | (范围 TS) |
template< InputRange R, class Proj =ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred > | (6) | (范围 TS) |
1) 检查一元谓词 pred 是否对范围
[
first,
last)
中的所有元素返回 true。3) 检查一元谓词 pred 是否对范围
[
first,
last)
中至少一个元素返回 true。5) 检查一元谓词 pred 是否不对范围
[
first,
last)
中任何元素返回 true。目录 |
[编辑]参数
first, last | - | 要检验的元素范围 |
rng | - | 要检验的元素范围 |
pred | - | 应用到投影后元素的谓词 |
proj | - | 应用到元素的投影 |
[编辑]返回值
1,2) 若 pred 对范围中所有元素返回 true 则为 true,否则为 false。若范围为空则返回 true。
3,4) 若 pred 对范围中至少一个元素返回 true 则为 true,否则为 false。若范围为空则返回 false。
5,6) 若 pred 不对范围中任何元素返回 true 则为 true,否则为 false。若范围为空则返回 true。
[编辑]复杂度
1-6) 至多应用 last - first 次谓词,应用 last - first 次投影。
[编辑]可能的实现
版本一 |
---|
template<InputIterator I, Sentinel<I> S, class Proj =ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred>bool all_of(I first, S last, Pred pred, Proj proj = Proj{}){returnranges::find_if_not(first, last, std::ref(pred), std::ref(proj))== last;} template<InputRange R, class Proj =ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred>bool all_of(R&& r, Pred pred, Proj proj = Proj{}){returnranges::all_of(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj));} |
版本二 |
template<InputIterator I, Sentinel<I> S, class Proj =ranges::identity, IndirectUnaryPredicate<projected<I, Proj>> Pred>bool any_of(I first, S last, Pred pred, Proj proj = Proj{}){returnranges::find_if(first, last, std::ref(pred), std::ref(proj))!= last;} template<InputRange R, class Proj =ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred>bool any_of(R&& r, Pred pred, Proj proj = Proj{}){returnranges::any_of(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj));} |
版本三 |
template<InputIterator I, Sentinel<I> S, class Proj = identity, IndirectUnaryPredicate<projected<I, Proj>> Pred>bool none_of(I first, S last, Pred pred, Proj proj = Proj{}){returnranges::find_if(first, last, std::ref(pred), std::ref(proj))== last;} template<InputRange R, class Proj =ranges::identity, IndirectUnaryPredicate<projected<ranges::iterator_t<R>, Proj>> Pred>bool none_of(R&& r, Pred pred, Proj proj = Proj{}){returnranges::none_of(ranges::begin(r), ranges::end(r), std::ref(pred), std::ref(proj));} |
[编辑]示例
运行此代码
#include <experimental/ranges/algorithm>#include <experimental/ranges/iterator>#include <functional>#include <iostream>#include <iterator>#include <numeric>#include <vector> namespace ranges = std::experimental::ranges; int main(){std::vector<int> v(10, 2);std::partial_sum(v.cbegin(), v.cend(), v.begin());std::cout<<"这些数中: ";ranges::copy(v, ranges::ostream_iterator<int>(std::cout, " "));std::cout<<'\n'; if(ranges::all_of(v.cbegin(), v.cend(), [](int i){return i %2==0;}))std::cout<<"所有数均为偶数\n";if(ranges::none_of(v, std::bind(std::modulus<int>(), std::placeholders::_1, 2)))std::cout<<"其中没有奇数\n"; struct DivisibleBy {constint d; DivisibleBy(int n): d(n){}bool operator()(int n)const{return n % d ==0;}}; if(ranges::any_of(v, DivisibleBy(7)))std::cout<<"至少一个数可被 7 整除\n";}
输出:
这些数中: 2 4 6 8 10 12 14 16 18 20 所有数均为偶数 其中没有奇数 至少一个数可被 7 整除
[编辑]参阅
(C++11)(C++11)(C++11) | 检查谓词是否对范围中所有、任一或无元素为 true (函数模板) |