【问题标题】:Interator and average in C++C ++中的迭代器和平均值
【发布时间】:2013-07-07 17:32:38
【问题描述】:

我正在尝试学习在 C++ 中将迭代器与向量一起使用,例如计算向量的平均值。

然而这段代码没有给出正确的答案,我不知道为什么!

double average(vector<double> const &v)
{
    vector<double>::size_type taille = v.size();
    double sum = 0;
    for(vector<double>::const_iterator i = v.begin(); i != v.end(); ++i)
        sum += v[*i];

    return sum/taille;
}

谁能给我一个提示?

提前非常感谢!再见:)

【问题讨论】:

  • 顺便说一句,在真实代码的情况下,你可以将std::accumulate的结果除以size()

标签: c++ vector iterator average


【解决方案1】:

在 C++ 中,迭代器模仿指针的行为(在某种程度上)。因此,如果it 是一个元素的迭代器,您可以通过取消引用 将其作为*it 访问该元素。

这意味着,而不是这个:

sum += v[*i];  

你应该这样写:

sum += *i; //just dereference the iterator!

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    通过迭代器访问向量项只是*i,而不是v[*i]。您使用的表单需要使用索引访问:

    for (size_t i = 0; i < v.size(); i++) sum += v[i];
    

    你的代码应该是这样的:

    for(vector<double>::const_iterator i = v.begin(); i != v.end(); ++i)
        sum += *i;
              ^^^^ note this
    

    【讨论】:

      【解决方案3】:

      迭代器实际上指向对象。正确的迭代方式是:

      double average(vector<double> const &v)
      {
          vector<double>::size_type taille = v.size();
          double sum = 0;
          for(vector<double>::const_iterator i = v.begin(); i != v.end(); ++i)
              sum += *it;
      
          return sum/taille;
      }
      

      在 C++11 中你也可以这样做:

      double average(vector<double> const &v)
      {
          double sum = 0;
          for(const double &d : v)
              sum += d;
      
          return sum/v.size();
      }
      

      【讨论】:

        猜你喜欢
        • 2016-06-30
        • 1970-01-01
        • 2016-02-07
        • 2012-12-27
        • 2022-01-16
        • 2019-02-12
        • 1970-01-01
        • 2015-09-29
        • 2021-08-11
        相关资源
        最近更新 更多