0

我正在构建QList<QList<double>> *以下方式,以在函数中返回randomPoint()

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_;
 }

但是在 for 循环之后有一个停止点,我注意到它pt_被正确填充(m_ndim元素),而lstPtitem_empty组成QList<double>。怎么了?

4

2 回答 2

5
lstPt_->append(pt_);

这会将 的副本放在pt_外部列表中。然后填充 local pt_,将副本留空。您应该在填充的循环之后移动这一行pt_。具体来说:

QList<double>  pt_;
for(int j=0;j<m_ndim;j++)
{
    pt_.append(TRandom::rand(bottom_[j],top_[j]));
}
lstPt_->append(pt_);
于 2012-04-10T14:09:54.793 回答
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 的复制构造函数)。因此,如果在将其添加到 lstPt_ 时 pt_ 为空,则会添加一个空列表。另一种方法是使用:

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

在这种情况下,您没有这个问题,但是您必须清理(删除)您创建的每个 pt_ 实例。

杰拉德

于 2012-04-10T14:21:19.520 回答