目前我正在阅读“Accelerated C ++”,在第4章的一个例子中,编写了一个函数来从输入流中读取,如下所示:
istream &read ( istream & in , vector < double >& work )
{
if ( in ) { // why it is needed ?
double x ; // x denotes the grade
work.clear ( ); // why we need it ?
while ( in >> x )
work.push_back ( x );
in.clear ( ); // understandable.
}
return in;
}
int main ( )
{
vector < double > homework;
vector <double> schoolwork;
read ( cin , homework );
read ( cin , schoolwork );
// code for output
}
为什么需要这样做:
if ( in ){.....}
因为while ( in >> x )
也扮演相同的角色,因为当输入流中存在错误(例如类型不匹配)时,它将停止输入并且流保持错误状态,这将使用{{1进一步清除}}。这样它就可以在in.clear()
之后适用于向量schoolwork
。
为什么homework
需要if ( in )
,尽管while ( in >> x )
可以执行相同的操作?
其次,我对work.clear( )
非常困惑。
为什么我们需要清除矢量本身,虽然我们是通过参考传递它的?
答案 0 :(得分:3)
如果流不好,请保持向量不变,而不是清除它。
该函数的行为是用输入替换work
的内容。没有clear
,它会附加输入。除非你阅读代码 - 重命名函数(例如replace
),或者按值返回向量而不是让调用者创建一个向量,否则模糊的函数名称和缺少文档会使得不清楚哪个是有意的,这会有所帮助这种含糊不清。