QtConcurrent的基础用法map,mapped,mappedReduced

实际上应该说多线程让QtConcurrent实现了并行可能更准确点。不然map函数就不好理解了。那么QtConcurrent的map函数又有什么用呢?这就要先看看map的参数了。map函数有两个参数,第一个是序列(如QList),第二个参数是一个函数。它的作用就是同时用第二个参数来计算第一个参数中的每一个元素,且结果直接覆盖到元素中。

    blob.png

    如QtConcurrent::map传入图中的QList和Func,QList中的1、3、5、7、9会同时执行Func函数。执行结束后QList值变为2、4、6、8、10。

 用实例说话:

    1.先定义Func函数。

void Func(int& a){
    a += 1;
}

   2.定义一个QList,调用map函数。

    QList<int> alist;
    alist<<1<<3<<5<<7<<9;

    QFuture<void> f = QtConcurrent::map(alist,Func); //map函数
    f.waitForFinished();
    qDebug()<<"alist"<<alist;

  运行结束后再打印出alist

blob.png

alist的值变为了2、4、6、8、10。另外Func函数被调用了5次,且多数在不同的线程中执行的,为什么说是大多数而不是全部呢?因为我们之前试过线程池默认最大线程数是4,而我们这里有5个数。

 

和map函数长的很相近的还有两个函数,一个是mapped,另一个是mappedReduced。 mapped的作用和map类似,只是把计算结果放到了新的容器中。举例:

    1.定义一个用于计算的函数,该函数有返回值

int func2(int a){
    return a + 1;
}

   2.调用mapped函数

    QList<int> alist;
    alist<<1<<3<<5<<7<<9;

    QFuture<int> f = QtConcurrent::mapped(alist,func2); //QFuture的类型为int
    f.waitForFinished();
    qDebug()<<"alist"<<alist;
    qDebug()<<"newlist"<<f.results();

blob.png

 从运行结果可以看到原容器的值没有改变。

 

mappedReduced函数比mapped多一个参数,这个参数也是个函数。作用就是将mapped出来的结果再计算最终得出一个值。如上例中计算得出的结果是2、4、6、8、10。我们可以在写一个函数将这些值加起来得到一个值。这个函数遵循如图形式

blob.png

result就是最后的结果。intermediate就是mapped出来的结果。接着举例。

 1.定义一个计算和的函数,形如上图。

void sum(int& result, const int& b){
    result += b;
}

 2.调用mappedReduced函数,查看运行结果。

    QList<int> alist;
    alist<<1<<3<<5<<7<<9;

    QFuture<int> result = QtConcurrent::mappedReduced(alist,func2,sum);
    result.waitForFinished();
    qDebug()<<result.result();

blob.png

结果是30,是由2、4、6、8、10相加得来的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燕山暮雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值