Qt QList无法按预期工作

时间:2012-04-10 14:02:50

标签: c++ qt qlist

我正在以下列方式构建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_填充QList<double> 1}}。发生了什么事?

2 个答案:

答案 0 :(得分: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_);

答案 1 :(得分: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_时为空,则会添加一个空列表。 另一种方法是使用:

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

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

杰拉德