从 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_if
和 vec.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) 从第一个删除时的性能