知道 istream 是否以 C++ 中的字符串开头的惯用方法?
Idiomatic way to know if an istream starts with a string in C++?
假设你有两个字符串,你想知道一个是否是另一个的前缀。这是在 C++ 中执行此操作的一种方法:
std::string s = ...;
std::string prefix = ...;
bool sStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), s.begin());
但是假设您有一个输入流而不是 s
:
std::istream& inputStream = ...;
std::string prefix = ...;
bool inputStreamStartsWithPrefix = ?
当然,我们可以通过编写 for 循环来计算 inputStreamStartsWithPrefix
。但是如何以惯用的方式做到这一点(没有 for 循环,使用算法)?
您可以将 std::istream_iterator
与 std::equal
结合使用,例如
std::istringstream is("foobar");
std::string prefix = "foo";
bool inputStreamStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), std::istream_iterator<char>(is));
无论如何你都必须从流中读取,所以你最好只从流中读取,然后检查你刚刚读取的内容看它是否以字符串开头。
当流不是以该字符串开头时,尝试做任何其他事情将使您很难做任何您想做的事情。 (当然,除非你的意图是退出程序)
假设你有两个字符串,你想知道一个是否是另一个的前缀。这是在 C++ 中执行此操作的一种方法:
std::string s = ...;
std::string prefix = ...;
bool sStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), s.begin());
但是假设您有一个输入流而不是 s
:
std::istream& inputStream = ...;
std::string prefix = ...;
bool inputStreamStartsWithPrefix = ?
当然,我们可以通过编写 for 循环来计算 inputStreamStartsWithPrefix
。但是如何以惯用的方式做到这一点(没有 for 循环,使用算法)?
您可以将 std::istream_iterator
与 std::equal
结合使用,例如
std::istringstream is("foobar");
std::string prefix = "foo";
bool inputStreamStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), std::istream_iterator<char>(is));
无论如何你都必须从流中读取,所以你最好只从流中读取,然后检查你刚刚读取的内容看它是否以字符串开头。
当流不是以该字符串开头时,尝试做任何其他事情将使您很难做任何您想做的事情。 (当然,除非你的意图是退出程序)