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

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

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

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

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

1 ответ

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 может сэкономить немного работы.

Другие вопросы по тегам