编程示例中的混淆

Confusion in a programming example

本文关键字:编程      更新时间:2023-10-16

当前我正在阅读"加速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 )也扮演着同样的角色,因为当输入流中出现错误(例如类型不匹配)时,它将停止接受输入,并且流保持在错误状态,这将使用in.clear()进一步清除。使得它可以在homework之后对向量schoolwork起作用。

  1. 那么,尽管我们有while ( in >> x ),但为什么需要if ( in )呢?

  2. 其次,我对work.clear( )非常困惑。

    为什么我们需要清除向量本身,尽管我们传递的是参考?

  1. 如果流不好,保持向量不变,而不是清除它。

  2. 函数的行为是用输入替换work的内容。如果没有clear,它将附加输入。模糊的函数名称和缺乏文档使其不清楚哪一个是意图,除非您阅读代码-重命名函数(例如replace),或按值返回向量而不是让调用方创建向量,将有助于解决这种模糊性。