[英]Why is the pipe operator not working when I use ranges in C++20?
[英]Can I use C++20 ranges to break when matched count is greater than some threshold?
考慮以下前置范圍代碼:
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;
}
完整代碼鏈接: https://godbolt.org/z/86djdK
你可以這樣做:
auto matches = v | rv::filter([=](int i){ return i == val; })
| rv::take(6);
return ranges::distance(matches) == 6;
或更好:
auto matches = v | rv::filter([=](int i){ return i == val; });
return not ranges::empty(matches | rv::drop(5));
這次嘗試:
std::ranges::views::take_while(v, [&cnt, &val](const auto elem){
cnt+=elem==val;
return cnt<6;
});
不符合take_while
的要求。 范圍內的所有謂詞都必須保持相等- 相同的輸入,相同的 output。 在這里,情況並非如此——如果我們在一個元素上調用謂詞兩次,我們會得到不同的 output。 所以這是未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.