std::stringstream - 字符串到数字工作

std::stringstream - string to number working

我正在学习 C++,我对以下代码的工作原理有疑问。我的目标是从命令行接受数字(作为 std::string),用空格分隔并将这些数字与字符串分开。我发布了另一个与此相关的问题,并使用下面的代码使程序运行。你能给我解释一下数字是如何从字符串中提取出来的吗?

string gradesFullLine;
getline(cin, gradesFullLine);
stringstream gradeStream(gradesFullLine);

for(gradeStream >> grade; gradeStream; gradeStream >> grade) {
    grades.push_back(grade);
}

下面是编写循环的更简单方法:

while(gradeStream >> grade) {
    grades.push_back(grade);
}

工作原理如下:

  1. gradeStream >> grade 调用 operator>>(std::istream, int)(或任何数字类型 grade)。这会尝试 "extract" 来自流的数字,并更新 "stream state" 指示成功或失败。
  2. 表达式 gradeStream >> grade 的结果,即 operator>>(std::istream, int) 的 return 值,是 gradeStream 本身。
  3. 任何标准流都有一个等效于 operator bool() const 的方法,它允许您在布尔上下文中使用流,例如 if()while() 条件。如果流是 "good",则此运算符 return 为真,这意味着它没有任何 I/O 错误(包括读取流的末尾)。
  4. 所以使用布尔值作为while条件,意思是只要gradeStream有一个"good state"就会进入循环,也就是说grade有填充了从流中提取的数字(这种提取如何发生由您的特定系统实现定义)。