我可以 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_iterator
与 std::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';
}
我有一个字符串流,我想对其进行迭代并确定其中是否存在子字符串。
我知道我可以转换为字符串并执行 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_iterator
与 std::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';
}