传递QVector指针作为参数

时间:2014-01-05 21:59:02

标签: c++ qt qtcore qvector

1)我想将一个QVector的指针传递给一个函数,然后用它做一些事情。我试过这个:

void MainWindow::createLinearVector(QVector<float> *vector, float min, float max )
{
    float elementDiff=(max-min)/(vector->size()-1);

    if(max>min) min -= elementDiff;
    else        min += elementDiff;

    for(int i=0; i< vector->size()+1 ; i++ )
    {
        min += elementDiff;
        *(vector+i) = min; //Problematic line
    }

}

然而,编译器为*(vector+i) = min;行提供了“不匹配operator =”。什么是在QVector上执行此类操作的最佳方式?

2)该函数应该在绘图的矢量上线性分布值,以matlab:运算符的方式工作,例如vector(a:b:c)。在Qt中执行此类操作的最简单,最好的方法是什么?

修改

在这里的帮助下,最初的问题得以解决。 :)

我也改进了metod本身。通过使用线性插值而不是像上面的多个添加,可以大大提高精度。通过多次加法,可以累积误差,这在很大程度上可以通过线性插值来消除。

顺便说一句,第一个函数中的if语句是不必要的,即使在多重加法方法中也可以通过重新排列一些东西来删除。

void MainWindow::createLinearVector(QVector<double> &vector, double min, double max )
{
    double range = max-min;
    double n =   vector.size();

    vector[0]=min;

    for(int i=1; i< n ; i++ )
    {
        vector[i] = min+ i/(n-1)*range;
    }
}

我考虑过使用一些增强的循环,但它会更实用吗? 例如,使用foreach循环,我仍然需要为插值增加一些变量吗?并且还跳过第一个元素的条件?

3 个答案:

答案 0 :(得分:4)

  

我想在QVector中放置一个浮动位置。

然后使用:

(*vector)[i] = min; //Problematic line

向量是指向QVector的指针,*vector将是QVector,可以像任何QVector一样用[i]指示。但是,由于优先权,需要使用括号来获得正确的操作顺序。

答案 1 :(得分:1)

我认为,首先你需要使用Mutable迭代器:Qt doc link

这样的事情:

QMutableVectorIterator<float> i(vector);
i.toBack();
while (i.hasPrevious())
    qDebug() << i.{your code}

答案 2 :(得分:1)

是的,所以在这里使用QVector指针没有多大意义。这就是原因:

  • 如果隐式共享对你来说不够快,那么使用方法参数的引用应该更多是C ++'。

  • 尽管如此,大多数情况下,你只需要传递参数而不将结果返回到同一个参数(即输出参数)中就不需要引用。这是因为* QVector是implicitly shared,并且根据文档仅对写入进行复制。幸运的是,在这两种情况下,方法的调用和内部实现的语法都是相同的,因此很容易从一个到另一个进行更改。

  • 最好使用智能指针而不是原始指针,但在我看来,这两者都是不必要的复杂解决方案。

因此,我建议将您的代码重构为:

void MainWindow::createLinearVector(QVector<float> &vector, float min, float max)
{
    float elementDiff = (max-min) / (vector.size()-1);

    min += ((max>min) ? (-elementDiff) : elementDiff)

    foreach (float f, vector) {
        min += elementDiff;
        f = min;
    }
}

请注意,我修复了代码中的以下内容:

  • 参考类型参数,而不是指针

  • “ - &gt;” 中成员决议为“。”分别

  • 在这种情况下,三元操作代替不自然的if / else

  • Qt的foreach而不是低级索引,在这种情况下你的原始观点变得毫无意义

然后,您将如何从调用者调用该方法:

createLinearVector(vector, fmin, fmax);