簡體   English   中英

當匹配計數大於某個閾值時,我可以使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM