首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++向量实践未声明变量

C++向量实践未声明变量
EN

Stack Overflow用户
提问于 2014-02-18 18:55:41
回答 2查看 304关注 0票数 0

这可能是一个简单的解决方案,但我对编程还不熟悉,它说我的ivec是未声明的。下面是说明和我的代码:

  1. 查询再分配的用户以获得更好的大小。
  2. 创造出一种更好的载体,它是由更多的用户指定的更大的规模。
  3. 再利用一个较好的循环,用随机数填充这个向量,每一个随机数都应该在约0到99(包含)范围内。
  4. 编写一种更好的、更好的功能,找出一个更好的向量的均值。功能应该有以下的基本原型:双平均(向量和数据);。
  5. 利用这一基本功能,找出较好的指标指标,较早地创造出较好的指标,并打印出较好的结果。
  6. 再用一个较好的循环,从向量中的每一种主要的核元中减去再加工的平均值。(通过这种方法,该向量现在应该有正的和间接的约值)。

这是我的密码

代码语言:javascript
复制
#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;

       }

上面写着我的爱维克是未申报的,所以我怎么申报。我很感谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2014-02-18 18:57:19

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

代码语言:javascript
复制
   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

代码语言:javascript
复制
if (!ivec.empty())
{
  double mean = std::accumulate(ivec.begin(), ivec.end(), 0.0)/ivec.size();
}
票数 6
EN

Stack Overflow用户

发布于 2014-02-18 19:22:50

函数平均值有几个错误。首先,std::vector没有具有名称大小的数据成员。它有一个具有名称大小的成员函数。所以,而不是例如表达式

代码语言:javascript
复制
ivec.size

一定有

代码语言:javascript
复制
ivec.size()

第二个错误是,您必须使用名称数据来代替nane ivec,因为在这个函数中没有声明名称ivec。

所以这个函数应该看起来像

代码语言:javascript
复制
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> &,因为向量本身在函数中没有更改。

更好的办法是用普通的语句来代替基于范围的语句。在本例中,函数将如下所示

代码语言:javascript
复制
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() );
}

这两种说法

代码语言:javascript
复制
   double dSum = 0.0;

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

实际上与标准算法std::accumulate的主体相对应。

这样您就可以编写(前提是包含了头<numeric>)

代码语言:javascript
复制
#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() );
}

同时也要考虑到你的程序不能完全满足任务。在作业中有书面的

代码语言:javascript
复制
Query the user for a size.
Create a vector of the size specified by the user.

同样在这个循环之后

代码语言:javascript
复制
for(int i = 0; i < ivec.size(); i ++)
    {
        ivec[i] = ivec[i] - mean;
    }

我认为您应该输出向量,以显示其元素的新值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21862850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档