当前位置 博文首页 > fearlazy: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。