std ::搜索单程范围

Tob*_*ull 8 c++ search iterator boyer-moore c++17

我想从a读取,std::istream直到找到一定数量的字符,即,我想实现以下接口:

void read_until (std::istream &is, std::string_view needle);
Run Code Online (Sandbox Code Playgroud)

使用std::istreambuf_iterator,我相信这相当于std::search单通道迭代器的组合.不幸的是,std::boyer_moore_searcher需要随机访问迭代器.

使用C++标准库(以及与大小成比例的一点内存sv)是否有上述接口的简单实现,或者我是否必须自己编写代码?

Yak*_*ont 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;
  });
}
Run Code Online (Sandbox Code Playgroud)

这是我能用std算法做到的最好的事情。

为了优化,使用循环buff可能会节省一些工作。