从 QVector 中删除所有小于 0 的元素

Posted

技术标签:

【中文标题】从 QVector 中删除所有小于 0 的元素【英文标题】:Remove all elements from QVector which are smaller than 0 【发布时间】:2017-11-21 11:42:14 【问题描述】:

我有一个QVector

 QVector(48, 64,  31, -2, 14, 5, 7, -3, -1, 13) 

我想知道如何使用Qt机制来删除所有小于0的元素。 我如何以简单的方式做到这一点? 谢谢

【问题讨论】:

尝试使用this method 【参考方案1】:

QVector 的接口允许它与 std 算法一起使用,因此您可以只使用 erase-remove idiom

QVector<int> vec;
...
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i)  return i < 0; ), 
          vec.end());

解释方式:

remove_if 采用一系列迭代器 (vec.begin(), vec.end()),并将提供的 lambda 返回 true 的所有元素移动到末尾。然后它返回一个迭代器到这个范围的开头。

erase 采用一系列迭代器(remove_ifvec.end() 的返回值)并将它们从向量中删除。

工作示例:

#include <QVector>
#include <iostream>

int main()

    QVector<int> vec  1, 2, 3, -1, -2, -3, 4, 5, 6, -7, -8, -1, 1, 2, 3 ;

    // erase all elements less than 0
    vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i)  return i < 0; ),
              vec.end());

    // print results
    for (int i : vec)
        std::cout << i << ' ';
    std::cout << '\n';

    return 0;

输出:

./a.out  
1 2 3 4 5 6 1 2 3

【讨论】:

没错,当分析这两种解决方案时,Remi 的解决方案与此解决方案相比需要大约 2 倍的时间......【参考方案2】:
// Create your list
QVector<int> listIntegers;
... 

// Remove all numbers < 0 from QVector<int> 
QMutableVectorIterator<int> i(listIntegers);
while (i.hasNext()) 
    if (i.next() < 0)
        i.remove();

你也可以修改这段代码来做你想做的事,只需改变while循环内的条件。

【讨论】:

JLev 不建议使用迭代器。这个问题是Erase-remove idiom 的典型应用,这就是JLev 的建议。我分析了这两种解决方案,这个解决方案大约需要擦除删除习语所需时间的 2 倍。因为它可能会在操作过程中多次调整容器的大小... @SteveLorimer,不,它不会跳过数组的第一个元素,因为 Qt 的 Java 风格的迭代器指向“中间”元素而不是元素本身,请参阅 here

以上是关于从 QVector 中删除所有小于 0 的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从 QVector<QVector<T>> 获取 QVector<T>?

QVector::remove(int i, int count) 从第一个删除时的性能

Qt6STL-QVector循环删除指针浅谈

如何从 QML 获取 QVector<qint16> 元素?

python如何打印所有大于0的元素数据

QVector 的范围