У меня есть следующая функция (пример с игрушкой, но она подходит для демонстрации):
// 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);
}
Я ищу более хороший и эффективный способ выполнить то же самое.
Мойпроблемы:
Я не могу использовать ручную итерацию + std :: all_of (от текущего элемента до n элементов впереди), потому что это слишком медленно (теоретически для каждого элемента, который я делаю доn приложений предикатов).
Мое решение выделяет память и вычисляет предикат для каждого элемента, хотя мы можем найти результат в первых 1% элементов.
Полный код здесь: https://wandbox.org/permlink/rBVFS64IcOI6gKe6