编程示例中的混乱

时间:2014-04-19 09:10:58

标签: c++

目前我正在阅读“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

  1. 为什么homework需要if ( in ),尽管while ( in >> x )可以执行相同的操作?

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

    为什么我们需要清除矢量本身,虽然我们是通过参考传递它的?

1 个答案:

答案 0 :(得分:3)

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

  2. 该函数的行为是用输入替换work的内容。没有clear,它会附加输入。除非你阅读代码 - 重命名函数(例如replace),或者按值返回向量而不是让调用者创建一个向量,否则模糊的函数名称和缺少文档会使得不清楚哪个是有意的,这会有所帮助这种含糊不清。