QtConcurrent之filter函数的使用
filter是过滤的意思,QtConcurrent::filter函数就是用来实现并行过滤的。filter和map函数的使用方式是一样的,分为filter、filtered和filteredReduced三个函数。
1.filter函数过滤一个序列,该序列的内容被修改。
2.filtered函数过滤一个序列,远序列的内容不被修改,过滤后的结果存在一个新的序列中。
3.filteredReduced函数过滤一个序列,过滤后的结果用一个函数计算最终获得一个值。
可以看出这三个函数和map的三个函数长的是一样的,理解了map函数再来理解filter就很容易了。map函数参考上一篇。
接下来还是用例子说话,在举例之前先说明一下。在使用QtConcurrent::map函数时有调用QFuture的waitForFinished,目的是让计算执行完成。QtConcurrent提供了map和filter对应的阻塞型函数,如blockingFilter、blockingMap(没有blockingRun)。这样我们就不需要调用waitForFinished了。
filter举例:
1.定义一个filterFunc函数用来过滤,返回值为bool类型。
bool filterFunc(int a) { return a > 5; //为true的留下... }
2.使用阻塞型函数过滤序列,查看结果。
QList<int> alist; alist<<1<<3<<5<<7<<9; QtConcurrent::blockingFilter(alist,filterFunc); qDebug()<<alist; //打印出原序列
alist的值发生了变化。
filtered举例:
1.直接在上例的基础上修改。调用blockingFiltered函数,打印出alist和blockingFiltered返回的结果。
QList<int> newlist = QtConcurrent::blockingFiltered(alist,filterFunc); qDebug()<<"alist"<<alist; qDebug()<<"newlist:"<<newlist;
alist的值没有改变,过滤后的结果通过函数返回。
filteredReduced举例:
1.增加一个函数,用来计算过滤后的结果。这个函数和map举例中的一样。
void sum(int& result, const int& val) //计算和 { result += val; }
2.调用blockingFilteredReduced,返回最终结果。
int result = QtConcurrent::blockingFilteredReduced(alist,filterFunc,sum); qDebug()<<result;
过滤结果7和9相加得16。