【问题标题】:Why do we need to use a stringstream when splitting a string?为什么我们在拆分字符串时需要使用字符串流?
【发布时间】:2020-07-11 23:57:08
【问题描述】:

请注意,我在今天之前从未使用过流,所以我对它们的理解仍然相当模糊。当我说了一些令人震惊的愚蠢的话时道歉。

这里我有一小段代码可以在每个空间将一个字符串流拆分成一堆字符串。

vector<string> words;
stringstream ss("some random words that I wrote just now");
string word;
while(getline(ss, word, ' ')){
    words.push_back(word);
}

我想知道为什么我们在这里使用stringstream,而不仅仅是string
这将像这样工作:

  1. 在内存位置 x 创建一个字符串对象
  2. 引用时,遍历每个字符并检查它是否为空格。之前的所有字符都应该临时保存在某个地方。
  3. 如果是空格,则抓取我们刚刚存储的所有内容并将其粘贴到向量的末尾,然后清除临时存储内容。如果不是空格,请返回第 2 步

"some random words that I wrote just now" 存储为stringstream 将如何帮助我们? 它只是制作一个字符流以便我们可以检查它们吗?这是必要的吗?我们是否总是这样做,即使是其他语言?

【问题讨论】:

  • 我不确定我是否理解这个问题。您正在使用字符串流,因为这就是您选择进行字符串拆分的方式。您可以使用其他方法进行字符串拆分,但这是您选择的方法。
  • 我不确定我是否理解所有的反对意见。问题很明确;答案是正确的。
  • @OP -- 使用std::stringstream 的代码可以正常工作。你的2)3)——有用吗?它有错误吗?是否存在未实现的极端案例?这就是使用std::stringstream 的原因——您编写的代码越少,发生错误的机会就越少。在现实生活中的 C++ 代码审查中,如果代码的目的是获取由空格分隔的每个字符串,并且您显示一个不使用 stringstream 而是使用 1)、2) 和 3 的字符串),如果代码被拒绝,无论它是否有效(或无效),都不要感到震惊。

标签: c++ types stream c++17


【解决方案1】:

我想知道为什么我们在这里使用字符串流,而不仅仅是字符串。

如果这是问题所在,那么使用stringstream 的一个重要原因很简单——因为程序员不费吹灰之力就可以工作。您编写的代码越少,出现错误的机会就越少。

您仅使用std::string 并搜索空格的方法需要C++ 程序员编写所有这些步骤(创建字符串、手动搜索空格等)。编写起来可能微不足道,但即使是最好的程序员也可能在微不足道的代码中犯错误。代码可能存在错误,可能无法涵盖所有​​极端情况等。

关于易用性:

当 C++ 程序员看到 stringstream 关于使用空格分隔字符串时,立即知道代码的用途。

另一方面,如果程序员决定仅使用string 并搜索空格来手动解析数据,则代码不会立即意识到当其他程序员读取代码时它会做什么。当然,这可能是其他程序员对代码的快速实现,但我敢打赌其他程序员会说“你为什么不使用 stringstream?”。

【讨论】:

    【解决方案2】:

    "some random words that I wrote just now" 存储为stringstream 将如何帮助我们?它只是制作一个字符流以便我们可以检查它们吗?有必要吗?

    std::stringstream 只允许您在字符串上使用常见的输入/输出操作,例如&gt;&gt;std::getline。您不能使用std::getline 来读取std::string,因此您首先将字符串放入std::streamstream。您可以按照您的描述自己循环遍历字符来完全解析字符串。

    我们是否总是这样做,即使是其他语言?

    至少在 Python 中没有。在那里你可以做words = line.split(' ')

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2017-04-17
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多