C ++:有效地更新QList

时间:2015-04-24 13:47:36

标签: c++ qt iterator

我有QList<float>。 我想循环它以在另一个QList中复制其值,并在旅途中将负值更改为0.

我成功迭代了输入列表。但我不知道如何更新输出的大小。 这是我试过的:

void resetNegValuesToZero(
        QList<float> &out, const QList<float> &in)
{
    // Create iterators for Qlists
    QList<float>::const_iterator i;
    QList<float>::iterator o = out.begin();

    // Loop over inputs and assign output list
    for (i = in.begin(); i != in.end(); ++i, ++o)
        if (*i<0) *o = 0;
        else *o = *i;

}

我想避免使用append方法。但是,我意识到这可能是不可能的,因为我可以腐蚀记忆...... 但我想确定一下!

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

QList实现了copy-on-write,因此您可以简化代码:

void resetNegValuesToZero(const QList<float> &in) {
    QList<float> out = in;
    for (QList<float>::iterator o = out.begin(); o != out.end(); ++o) {
        if (*o < 0) {
            *o = 0;
        }
    }
}

如果你不能为out创建一个新的QList并且它必须是来自外部的参数那么你应该至少为你需要的所有元素保留足够的空间(重新分配是非常慢的):

void resetNegValuesToZero(QList<float> &out, const QList<float> &in) {
    QList<float>::const_iterator it = in.begin();

    out.reserve(in.count()); // Assuming out is empty
    for (int i=0; it != in.end(); ++it, ++i)
        out.insert(i, *it < 0 ? 0 : *it);
}

答案 1 :(得分:0)

不幸的是,QList没有resize()方法。

我个人clear()目标列表reserve(),然后使用append()push_back()填充它。这仍然会避免重新分配内部存储。

当然,您可以始终out = in然后迭代out并更改所需的值。这将复制out的底层存储,我假设操作将足够有效地实现。

也许您应该考虑使用QVector - 它稍微提高效率,因为它不会在开头预先分配空间,而且它确实有一个功能齐全的API,包括保留和调整大小。