当前位置 博文首页 > fearlazy:QtConcurrent之filter函数的使用

    fearlazy:QtConcurrent之filter函数的使用

    作者:[db:作者] 时间:2021-06-18 12:35

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/96.html

    ?

    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;??//打印出原序列
    

    blob.png

    ? alist的值发生了变化。

    ?

    ????filtered举例:

    ??? 1.直接在上例的基础上修改。调用blockingFiltered函数,打印出alist和blockingFiltered返回的结果。

    ????QList<int>?newlist?=?QtConcurrent::blockingFiltered(alist,filterFunc);
    ????qDebug()<<"alist"<<alist;
    ????qDebug()<<"newlist:"<<newlist;
    

    ????blob.png

    alist的值没有改变,过滤后的结果通过函数返回。

    ?

    ????filteredReduced举例:

    ????1.增加一个函数,用来计算过滤后的结果。这个函数和map举例中的一样。

    void?sum(int&?result,?const?int&?val)??//计算和
    {
    ????result?+=?val;
    }
    

    ? ? 2.调用blockingFilteredReduced,返回最终结果。

    ????int?result?=?QtConcurrent::blockingFilteredReduced(alist,filterFunc,sum);
    ????qDebug()<<result;
    

    blob.png

    过滤结果7和9相加得16。

    下一篇:没有了