我可以 std::find 字符串流中的字符串吗?

can I std::find a string in a stringstream?

我有一个字符串流,我想对其进行迭代并确定其中是否存在子字符串。

我知道我可以转换为字符串并执行 std::string::find(),但我只是希望尽可能避免从字符串流到字符串的转换。

我知道以下内容不起作用,因为 istream_iterator 使用 char 作为其类型(不是字符串)

stringstream ssBody;
string sFindThis;

...

auto itr = std::find (
    istreambuf_iterator<char>(ssBody),
    istreambuf_iterator<char>(),
    sFindThis
);

但是我能否以某种方式在不转换为字符串的情况下使用 std::find 或类似的方法在 stringstream 中搜索字符串?

C++ 标准未定义任何 std::[io]?stringstream 搜索其内容的方法。

您也不能将 std::istreambuf_iteratorstd::search() 一起使用,因为 std::istreambuf_iterator 是输入迭代器,但 std::search() 需要前向迭代器。

搜索字符串流的唯一有效方法是首先将其转换为 std::string

使用 pubsetbuf 可以将缓冲区与 basic_stringbuf 成员相关联,然后搜索缓冲区,但是此函数的行为是实现定义的。解释和例子来自http://en.cppreference.com/w/cpp/io/basic_stringbuf/setbuf

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream ss;
    char c[1024] = {};
    ss.rdbuf()->pubsetbuf(c, 1024);
    ss << 3.14 << '\n';
    std::cout << c << '\n';
}