Накопить через вектор указателей

Поэтому мне нужно сложить некоторые двойники, которые находятся в векторе, используя накопление, где мой VECTOR на самом деле является указателем на объекты.

Теперь, когда я использую накопление с int для initVal, он запускается, давая мне ответ, подобный -3.3695e + 008, но когда я ставлю здесь двойное число, я получаю, что «+»: добавление указателя требует интегрального операнда ». Я перепробовал множество способов исправить это, подумав о передаче указателей в алгоритме накопления, и я искал кое-что об итераторе разыменования, но не смог найти решение своей проблемы (я полагаю, из-за неопытности)
Накапливать

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;

}

И часть кода (данные передаются через «конструктор файлов» во втором классе:

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;

0

Решение

Проблема в том, что ваши векторные магазины указатели, Итак std::accumulate вычислит сумму указателей.

Вы должны использовать версию с четырьмя аргументами std::accumulateи предоставьте свою собственную функцию, которая выполняет вычисления правильно, что-то вроде

dMean = std::accumulate(
m_vectorData.begin(), m_vectorData.end(), 0.0,
[] (const double acc, const CData* data) { return acc + data->getData(); }
);
3

Другие решения

Используйте лямбда-выражение. Попробуйте следующее

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();
}
1