2012-04-10 49 views
0

我建立一个QList<QList<double>> *以下方式,在功能randomPoint()返回工作:的Qt的QList并不如预期

QList<QList<double>> *solverMethod::randomPoint(double* bottom_, double* top_, int items_) 
{ 
    QList<QList<double>> *lstPt_ = new QList<QList<double>>; 

     for(int i=0;i<items_;i++) 
     { 
      QList<double> pt_; 
      lstPt_->append(pt_); 
      for(int j=0;j<m_ndim;j++) 
      { 
       pt_.append(TRandom::rand(bottom_[j],top_[j])); 
      } 
     } 
     return lstPt_; 
} 

但随着循环后停止点,我注意到pt_填入正确( m_ndim元素),而lstPtitem_QList<double>组成。发生什么事?

+0

在第一个循环中pt_是什么?代码复制中缺少或错误。 – Gorpik 2012-04-10 14:13:55

回答

5
lstPt_->append(pt_); 

这使得一个外列表复制的pt_。然后填充本地pt_,将副本留空。您应该在填充pt_的循环之后移动此行。具体做法是:

QList<double> pt_; 
for(int j=0;j<m_ndim;j++) 
{ 
    pt_.append(TRandom::rand(bottom_[j],top_[j])); 
} 
lstPt_->append(pt_); 
+0

它没有改变任何东西,也尝试了。 – octoback 2012-04-10 14:11:52

+1

@dlib:那么我建议你再试一次;我很确定,更改代码以匹配我的答案会改变结果。 – 2012-04-10 14:15:30

1

试试这个:

QList<double> pt_; 
for(int j=0;j<m_ndim;j++) 
{ 
    pt_.append(TRandom::rand(bottom_[j],top_[j])); 
} 
lstPt_->append(pt_); 

当你这样做:

lstPt_->append(pt_); 

PT_的副本添加到lstPt_(QList作的拷贝构造函数将被调用)。因此,如果将pt_添加到lstPt_时pt_为空,则会添加一个空列表。 另一种方法是使用:

QList< QList<double>* > lstPt_; 
... 
QList<double>* pt_ = new QList<double>; 
lstPt_->append(pt_); 
for(...) 
{ 
    ... 
} 

在这种情况下,你不会有这个问题,但你必须清理(删除)PT_您创建的每一个实例。

杰拉德