C++ 在向量中找到高于阈值的连续值的最佳方法

C++ 在向量中找到高于阈值的连续值的最佳方法,c++,algorithm,vector,C++,Algorithm,Vector,找到阈值以上最小连续值的最快方法是什么 i、 e 假设我有一个值向量: std::vector<int> v = [10 25 8 49 50 61 55 45 34 10 8] 一个简单的方法是迭代向量 int threshold = 40; int consecutive = 5; bool success = false; for(int i = 0; i < v.size()-consecutive; ++i) { int counter = 0;

找到阈值以上最小连续值的最快方法是什么

i、 e

假设我有一个值向量:

std::vector<int> v = [10 25 8 49 50 61 55 45 34 10 8]
一个简单的方法是迭代向量

int threshold = 40;
int consecutive = 5;

bool success = false;

for(int i = 0; i < v.size()-consecutive; ++i)
{
    int counter = 0;

    while(i+counter < v.size())
    {
        if(v[i+counter] > threshold)
        {
            counter++;
        }
    }

    if(counter >= consecutive)
    {
        success = true;
        break;
    }
}
编辑:适用于@cmbasnett

如果在向量v中找到超过40的5个连续值,则预期结果为success=true,否则为false。

您可以使用std::search\n执行此操作:

通过跳过失败的元素,您可以更高效地编写自己的优化版本,有点像Boyer Moore Hoorspool搜索:

template<typename It, typename T>
bool contains_n_gt_x(It first, It last, size_t n, const T& x) {
    for (auto curr = first; first != last;) {
        first = find_if(curr, last, [&](const auto& y){ return x < y; });
        curr = find_if(first, last, [&](const auto& y){ return !(x < y); });
        if (distance(first, curr) >= n) return true;
    }
    return false;
}

.

听起来像是可有可无。您可能希望让我们知道您的示例的预期结果是。使用预期结果编辑,Codibility?如果在v中发现超过5个超过40的连续值,答案应该是什么?只是好奇:你认为这会和问题中的循环一样快吗?@JerryJeremiah搜索版本应该和问题中的循环一样快。第二个版本应该更快。
template<typename It, typename T>
bool contains_n_gt_x(It first, It last, size_t n, const T& x) {
    for (auto curr = first; first != last;) {
        first = find_if(curr, last, [&](const auto& y){ return x < y; });
        curr = find_if(first, last, [&](const auto& y){ return !(x < y); });
        if (distance(first, curr) >= n) return true;
    }
    return false;
}