std::experimental::ranges::all_of, std::experimental::ranges::any_of, std::experimental::ranges::none_of

来自cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
实验性
技术规范
文件系统库(文件系统 TS)
库基础(库基础 TS)
库基础 2(库基础 TS v2)
库基础 3(库基础 TS v3)
并行扩展(并行 TS)
并行扩展 2(并行 TS v2)
并发扩展(并发 TS)
并发扩展 2(并发 TS v2)
概念(概念 TS)
范围(范围 TS)
反射(反射 TS)
数学特殊函数(特殊函数 TR)
实验性非 TS 功能特性
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
 
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{});
(1) (范围 TS)
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{});
(2) (范围 TS)
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{});
(3) (范围 TS)
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{});
(4) (范围 TS)
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{});
(5) (范围 TS)
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{});
(6) (范围 TS)
1) 检查一元谓词 pred 是否对范围 [firstlast) 中的所有元素返回 true
3) 检查一元谓词 pred 是否对范围 [firstlast) 中至少一个元素返回 true
5) 检查一元谓词 pred 是否不对范围 [firstlast) 中任何元素返回 true
2,4,6)(1,3,5),但以 r 为源范围,如同以 ranges::begin(rng)first 并以 ranges::end(rng)last

目录

[编辑]参数

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
(函数模板)[编辑]
close