C ++ vector实践未声明的变量

时间:2014-02-18 18:55:42

标签: c++

它可能是一个简单的解决方案,但我仍然是编程的新手,它说我的ivec是未声明的。以下是说明和我的代码:

  1. 向用户查询的尺寸..
  2. 创建由用户指定的尺寸的向量。
  3. 使用一个循环,填充随机数这种载体。每一个随机数应该在 取值范围为0至99(包括在内)。
  4. 编写发现的矢量的平均值的函数。该函数应具有以下 原型:双平均(矢量&安培;数据);
  5. 使用此功能找到前面创建的矢量的均值和打印结果。
  6. 使用一个循环,从向量的每个元素中减去所述平均值。 (顺便说一句,这 矢量现在应该有正数和负数。)
  7. 这是我的代码

    #include <iostream>
    #include <vector>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    //prototype
    double mean(vector<int> & data);
    
    int main()
    {
        const int SIZE = 10;
        vector<int> ivec(SIZE);
        int srand(time(0));
        double m;
    
        for(int i = 0; i < ivec.size(); i++)
            {
                ivec[i] = rand() % 99 + 1;
    
            }
    
        m = mean(ivec);
    
        for(int i = 0; i < ivec.size(); i ++)
            {
                ivec[i] = ivec[i] - mean;
            }
    
        return 0;
    }
    
    double mean(vector<int> & data)
           {
               double dSum = 0;
               for(int i = 0; i < ivec.size; i++)
                {
                    dSum += data[i];
                }
               return dSum/ivec.size;
    
           }
    

    它说我的ivec是未宣布的,所以我将如何申报。我很感激帮助

2 个答案:

答案 0 :(得分:6)

mean函数的参数名为data,因此您需要使用该参数:

   double mean(const vector<int>& data)
   {
       double dSum = 0;
       for(int i = 0; i < data.size(); i++)
        {
            dSum += data[i];
        }
       return dSum/data().size;

   }

另请注意,size是成员函数,因此您需要调用size()。此外,矢量应该通过const引用传递,因为它没有被修改。

注意:计算平均值的惯用方法是使用std::accumulate

if (!ivec.empty())
{
  double mean = std::accumulate(ivec.begin(), ivec.end(), 0.0)/ivec.size();
}

答案 1 :(得分:0)

你在函数意义上有几个错误。首先,std :: vector没有名称大小的数据成员。它有一个名称大小的成员函数。所以不是例如表达式

ivec.size

必须有

ivec.size()

第二个错误是你不得不使用名称数据,因为在这个函数中没有声明名称ivec。

因此该函数应该看起来像

double mean( const vector<int> &data )
{
   double dSum = 0.0;

   for ( std::vector<int>::size_type i = 0; i < data.size(); i++ )
   {
      dSum += data[i];
   }

   return ( data.size() == 0 ? 0.0 : dSum / data.size() );
}

我将参数的类型更改为const vector<int> &,因为函数中的矢量本身没有更改。

将普通for语句替换为基于范围的for语句会更好。在这种情况下,该函数将显示为

double mean( const vector<int> &data )
{
   double dSum = 0.0;

   for ( int x : data ) dSum += x;

   return ( data.size() == 0 ? 0.0 : dSum / data.size() );
}

这两个陈述

   double dSum = 0.0;

   for ( int x : data ) dSum += x;

实际上对应于标准算法std::accumulate

的主体

所以你可以写(如果你包括标题<numeric>

#include <numeric>

//...

double mean( const vector<int> &data )
{
   double dSum = std::accumulate( data.begin(), data.end(), 0.0 );

   return ( data.size() == 0 ? 0.0 : dSum / data.size() );
}

还要考虑到您的计划不能完全满足作业。在作业中写了

Query the user for a size.
Create a vector of the size specified by the user.

此循环之后

for(int i = 0; i < ivec.size(); i ++)
    {
        ivec[i] = ivec[i] - mean;
    }

我认为你应该输出用于显示其元素的新值的向量。