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

Поэтому мне нужно суммировать несколько удвоений, которые находятся в векторе, с помощью накопителя, где мой ВЕКТОР фактически является указателем на объекты.

Теперь, когда я использую накопление с 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;  

person Skunk8    schedule 28.03.2014    source источник


Ответы (2)


Проблема в том, что ваш вектор хранит указатели, поэтому 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(); }
);
person Some programmer dude    schedule 28.03.2014
comment
Забыли dMean / n в конце? ;) - person Shoe; 28.03.2014
comment
Гоша ... Большое спасибо! Это действительно работает (вот так просто). Если у вас есть минутка - не могли бы вы объяснить мне, как вы определяете функцию в самом накопителе и [] перед ним ?? И, кстати, это не сработает, если я определю функцию вне него? - person Skunk8; 28.03.2014
comment
На самом деле в приведенном ниже комментарии было лямбда-выражение, так что я понял. Еще раз спасибо за помощь! - person Skunk8; 28.03.2014

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

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();
 }
person Vlad from Moscow    schedule 28.03.2014