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。