【问题标题】:Idiomatic way to know if an istream starts with a string in C++?了解 istream 是否以 C++ 中的字符串开头的惯用方法?
【发布时间】:2015-08-11 17:04:53
【问题描述】:

假设你有两个字符串,你想知道一个是否是另一个的前缀。这是在 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 循环,使用算法)来做到这一点?

【问题讨论】:

    标签: c++ algorithm stl istream


    【解决方案1】:

    您可以将std::istream_iteratorstd::equal 结合使用

    std::istringstream is("foobar");
    std::string prefix = "foo";
    bool inputStreamStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), std::istream_iterator<char>(is));
    

    【讨论】:

      【解决方案2】:

      无论如何,你都必须从流中读取,所以你最好只从流中读取,然后检查你刚刚读取的内容的内容,看看它是否以字符串开头。

      当流不以该字符串开头时,尝试做任何其他事情会使您很难做任何您想做的事情。 (当然,除非你的意图是退出程序)

      【讨论】:

      • 除非这些流太大以至于无法放入内存。 . .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2011-05-04
      相关资源
      最近更新 更多