STL或Ranges算法可有效地找到满足谓词的n个连续元素

问题描述 投票:0回答:1

我具有以下功能(玩具示例,但易于演示):

  // finds the iterator pointing to the start of n consectuve 47s or return values.end() if not found
  auto find_n_47s(const int n, const std::vector<int>& values){
    std::vector<bool> predicate_result;
    predicate_result.reserve(values.size());
    std::transform(values.begin(), values.end(), std::back_inserter(predicate_result), []
                   (const auto& val){return val==47; });
    std::vector<bool> search_pattern(n, true);
    auto it= std::search(predicate_result.begin(), predicate_result.end(), 
                       search_pattern.begin(), search_pattern.end());
    return values.begin() + std::distance(predicate_result.begin(), it);  
}

我正在寻找一种更好,更有效的方法来完成同一件事。

我的问题:

  1. 我不能使用手动迭代+ std :: all_of(从当前元素到前面的n个元素),因为它太慢了(理论上每个元素我最多处理n个谓词应用程序。)

  2. 我的解决方案分配内存并为每个计算谓词元素,尽管我们可能会在结果的前1%中找到结果元件。

此处为完整代码:https://wandbox.org/permlink/rBVFS64IcOI6gKe6

c++ stl c++20 range-v3
1个回答
0
投票

正如Cruz Jean指出的,您可以使用search_n:

© www.soinside.com 2019 - 2024. All rights reserved.