Я хотел бы прочитать из std::istream
пока не будет найдена определенная последовательность символов, то есть я бы хотел реализовать следующий интерфейс:
void read_until (std::istream &is, std::string_view needle);
С помощью std::istreambuf_iterator
Я считаю, что это эквивалентно комбинации std::search
на однопроходном итераторе. К сожалению, std::boyer_moore_searcher
нужны итераторы с произвольным доступом.
Существуют ли простые реализации вышеупомянутого интерфейса, использующие стандартную библиотеку C ++ (и объем памяти, пропорциональный размеру sv
) или я должен сам это кодировать?
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
может сэкономить немного работы.
Других решений пока нет …