C++:有效地更新 QList

C++: Update a QList efficiently

我有一个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 方法。但是,我意识到这可能是不可能的,因为我可能会破坏记忆…… 但我想确定一下!

感谢您的帮助!

很遗憾,QList 没有 resize() 方法。

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

当然,您总是可以 out = in 然后迭代 out 并更改所需的值。这将复制 out 的底层存储,我认为该操作将足够有效地实施。

也许您应该考虑使用 QVector - 它的效率稍微高一些,因为它不会在开始时预先分配 space,而且它确实具有完整的功能 API,包括保留和调整大小。

QList 实现写时复制,因此您可以简化代码:

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 并且它必须是来自外部的参数那么你应该至少为你需要的所有元素预留足够的 space (重新分配是什么相当慢):

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