1

そのため、ベクトルに含まれるいくつかの double を合計する必要があります。ここで、私の VECTOR は実際にはオブジェクトへのポインターです。

initVal に int を指定して Accumulate を使用すると、-3.3695e+008 のような答えが返されますが、そこに double を入れると、「'+' : ポインターの追加には整数オペランドが必要です」というメッセージが表示されます。私はそれを修正するために多くの方法を試しました。蓄積アルゴリズムで渡されるポインターについて考え、逆参照イテレーターについていくつか検索しましたが、問題の解決策にたどり着くことができませんでした (期限が切れていないためだと思います) 蓄積:

void calcDMean(){
    dMean= 0.0 ;

    vector<CData*> :: iterator it = m_vectorData.begin();
    int n = m_vectorData.size();
//  dMean = accumulate(m_vectorData.begin(), m_vectorData.end(), 0.0);
    dMean = accumulate(it,m_vectorData.end(),0.0);

    dMean = dMean/n;

 }

そして、残りのコードの一部 (データは、2 番目のクラスの「ファイル コンストラクター」を介して渡されます。

class CData {
int m_iTimeID;
double m_dData;
public:
CData (){                                   
    m_iTimeID = 0;
    m_dData = 0;
}

CData (const CData& obekt){               //Copy 
    m_iTimeID=obekt.m_iTimeID;
    m_dData=obekt.m_dData;
}

int getID() const{                      //GET ID
    return m_iTimeID;}

double getData() const {                 //GET DATA
    return m_dData;}


double operator+(CData &obekt){             
    return (m_dData + obekt.m_dData);
} ;

double operator+(double b){             
    return (m_dData + b);
} ; 
};

class CCalc3SigmaControl {
vector<CData*> m_vectorData; 
double sigmaUp;   
double sigmaDown; 
double dMean;  
4

2 に答える 2

4

あなたが抱えている問題は、ベクトルがポインターを格納しているため、std::accumulateポインターの合計が計算されることです。

の 4 引数バージョンを使用std::accumulateし、適切に計算を行う独自の関数を提供する必要があります。

dMean = std::accumulate(
    m_vectorData.begin(), m_vectorData.end(), 0.0,
    [] (const double acc, const CData* data) { return acc + data->getData(); }
);
于 2014-03-28T12:49:01.640 に答える
1

ラムダ式を使用します。以下を試してください

void calcDMean()
{
    double sum  = std::accumulate( m_vectorData.begin(), m_vectorData.end(), 0.0,
                                   []( double acc, CData *p ) 
                                   { return ( acc + p->getData() ); } );

    dMean = m_vectorData.size() == 0 ? 0.0 : sum / m_vectorData.size();
 }
于 2014-03-28T12:55:44.907 に答える