std :: поиск в однопроходном диапазоне

Я хотел бы прочитать из std::istream пока не будет найдена определенная последовательность символов, то есть я бы хотел реализовать следующий интерфейс:

void read_until (std::istream &is, std::string_view needle);

С помощью std::istreambuf_iteratorЯ считаю, что это эквивалентно комбинации std::search на однопроходном итераторе. К сожалению, std::boyer_moore_searcher нужны итераторы с произвольным доступом.

Существуют ли простые реализации вышеупомянутого интерфейса, использующие стандартную библиотеку C ++ (и объем памяти, пропорциональный размеру sv) или я должен сам это кодировать?

8

Решение

void read_until (std::istream &is, std::string_view needle) {
if (needle.size()==0) return;
std::string buff;
buff.reserve(needle.size());
auto it = std::find_if( std::istream_iterator<char>(is), std::istream_iterator<char>(), [&](char c) {
buff.push_back(c);
if (buff.size() < needle.size()) {
return false;
}
if (buff == needle)
return true;
buff.erase(buff.begin());
return false;
});
}

это лучшее, что я могу сделать с std алгоритмы.

Для оптимизации используется циркуляр buff может сэкономить немного работы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]