Qt QList无法按预期工作

Qt QList not working as expected

本文关键字:工作 QList Qt      更新时间:2023-10-16

我正在通过以下方式构建一个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元素),而lstPt是由item_QList<double>组成的。发生了什么事情?

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

试试这个:

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_时为空,则将添加一个空列表。另一种方法是使用:

QList< QList<double>* > lstPt_;
...
QList<double>*  pt_ = new QList<double>;
lstPt_->append(pt_);
for(...)
{
    ...
}
在这种情况下,您

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

杰拉尔德