考虑以下前置范围代码:
std::vector<int> v(1000*1000);
bool count_gt_5_v1(int val){
return std::count(v.begin(), v.end(), val)>5;
}
它看起来比原始循环更好,但如果 val 在 v 中很常见,它可能会非常低效。
有什么方法可以使用 C++20 范围,以便在我遇到 val 6 次后停止迭代。换句话说,我正在寻找一种在满足我的条件时引入休息的方法。我有这个可憎的东西,这似乎有效,但它比原始 for 循环丑得多。
bool count_gt_5_v2(int val){
int cnt=0;
auto span = std::ranges::views::take_while(v,[&cnt, &val]
(const auto elem)
{
cnt+=elem==val;
return cnt<6;
});
std::ranges::distance(span);
return cnt==6;
}