【问题标题】:Accumulate through a vector of pointers通过指针向量累加
【发布时间】:2014-03-28 12:45:26
【问题描述】:

所以我需要使用累积来对向量中的一些双精度值求和,其中我的 VECTOR 实际上是指向对象的指针。

现在,当我对 initVal 使用带有 int 的累积时,它会运行给我一个类似 -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;  

【问题讨论】:

    标签: c++ pointers vector accumulate


    【解决方案1】:

    您遇到的问题是您的向量存储指针,因此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(); }
    );
    

    【讨论】:

    • 最后忘记了dMean / n? ;)
    • 天哪...非常感谢!它确实有效(就这么简单)。如果你有时间 - 你能向我解释一下你在 accumulte 本身和它前面的 [] 中定义函数的方式吗?顺便说一句,如果我在它之外定义函数,它就行不通了?
    • 实际上下面的评论有它 - lambda 表达式,所以我明白了。再次感谢您的帮助!
    【解决方案2】:

    使用 lambda 表达式。试试下面的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 2014-06-05
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多