注册 登录
编程论坛 C++教室

C++初学者真诚求高手指点,万谢万谢!

dyyuibe 发布于 2010-11-15 10:09, 2278 次点击
请看一下程序:
#include "stdafx.h"
#include <iostream>
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
class MVector
{
  // storage for the new vector class
  std::vector<double> v;
  public:
    // constructor
    explicit MVector(){};
    explicit MVector(int n):v(n){};
    explicit MVector(int n,double x):v(n,x){};
    // destructor
    ~MVector(){};
    // equate vectors;
    MVector& operator=(const MVector& X)
    {if(&X==this)return *this;v=X.v;return *this;};
    // access data in vector
    double& operator[](int index){return v[index];};
    // access data in vector (const)
    double operator[](int index) const {return v[index];};
    // size of vector
    int size() const {return v.size();};
 void push_back(double x){v.push_back(x);}
}; // end class MVector

    void runningaverage(const MVector &v,int m,int p)
 {
      MVector runningaverage(v.size()-m-p);
 cout << " runningaverage:= ( ";

   for(int i=0;i<=runningaverage.size();i++)
   {
    double sum=0.;
    for(int j=i;j<=i+m+p;j++){sum+=v[j];}
    runningaverage[i]=sum/(m+p+1);
    cout << runningaverage[i] << " " ;
   }
cout << ")\n";

 }
   
int main(int argc, char** argv)
{
 MVector x;
    x.push_back(1.2);
 x.push_back(2.1);
 x.push_back(1.9);
    x.push_back(3.4);
 x.push_back(3.9);
 x.push_back(2.7);
 x.push_back(1.6);
 x.push_back(2.3);
 x.push_back(2.4);
 cout << " x:= ( ";
 for (int i=0;i<x.size();i++)
  cout << x[i] << "  ";
 cout << ")\n";
 runningaverage(x,2,1);
}
先说下我想求一个数列的移动平均数runningaverage,其定义见附件的图。
之前都是好好,Class MVector的部分是照搬老师的,完全没有问题,问题出现在加了runningaverage函数以后,所以你仔细看看runningaverage的循环。结果是能运行出来的,就是跳出俩窗口说
1、Expression:vector subscript out of range.
2、Expression:("Standard C++ libraries out of range",0)
为什么会这样呢?不明白。求解答。
万谢万谢!!
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
6 回复
#2
玩出来的代码2010-11-15 15:28
for(int i=0;i<=runningaverage.size();i++)注意容器的大小,两个范围都越界了。编译器在执行你的程序后进行错误检测。
#3
dyyuibe2010-11-15 18:29
回复 2楼 玩出来的代码
什么意思?我才学了俩月不明白。

什么叫容器过界?

那还有救吗?

要怎么改才能把这个running average算出来呢?
#4
m21wo2010-11-15 18:36
程序代码:

#include <iostream>
#include<fstream>
#include<vector>
#include<cmath>
using namespace std;
class MVector
{
    // storage for the new vector class
    std::vector<double> v;
public:
    // constructor
    explicit MVector(){};
    explicit MVector(int n):v(n){};
    explicit MVector(int n,double x):v(n,x){};
    // destructor
    ~MVector(){};
    // equate vectors;
    MVector& operator=(const MVector& X)
    {if(&X==this)return *this;v=X.v;return *this;};
    // access data in vector
    double& operator[](int index){return v[index];};
    // access data in vector (const)
    double operator[](int index) const {return v[index];};
    // size of vector
    int size() const {return v.size();};
    void push_back(double x){v.push_back(x);}
}; // end class MVector

void runningaverage(const MVector &v,int m,int p)
{
    MVector runningaverage(v.size()-m-p);
    cout << " runningaverage:= ( ";

    for(int i=0;i<runningaverage.size();i++)  //i<runningaverage.size() 改为这就ok 了
    {
        double sum=0.;
        for(int j=i;j<=i+m+p;j++){sum+=v[j];}
        runningaverage[i]=sum/(m+p+1);
        cout << runningaverage[i] << " " ;
    }
    cout << ")\n";

}

int main(int argc, char** argv)
{
    MVector x;
    x.push_back(1.2);
    x.push_back(2.1);
    x.push_back(1.9);
    x.push_back(3.4);
    x.push_back(3.9);
    x.push_back(2.7);
    x.push_back(1.6);
    x.push_back(2.3);
    x.push_back(2.4);
    cout << " x:= ( ";
    for (int i=0;i<x.size();i++)
        cout << x[i] << "  ";
    cout << ")\n";
    runningaverage(x,2,1);
}
#5
dyyuibe2010-11-15 18:54
回复 3楼 dyyuibe
啊!!!好快好及时

谢谢你!!
#6
dyyuibe2010-11-15 19:09
回复 4楼 m21wo
不好意思,太激动了手一抖点回复点错了,回给自己那儿去了。

再次谢谢你!
#7
张丹2011-06-02 14:58
我的也出现这种情况         779:   _DEBUG_ERROR("vector subscript out of range");
看看楼主的,对比一下,我的也没有什么不对的,但就是报这个错!简直很郁闷!!
1