8

我想从a读取std::istream直到找到某个字符序列,即我想实现以下接口:

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

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

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

4

1 回答 1

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可能会节省一些工作。

于 2018-10-02T18:03:23.977 回答