首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QtConcurrent::mappedReduced未映射

QtConcurrent::mappedReduced未映射
EN

Stack Overflow用户
提问于 2021-05-10 02:05:41
回答 1查看 70关注 0票数 0

考虑以下代码(Qt 6.0.3,C++17):

代码语言:javascript
复制
const QVector<int> arr = {1, 2, 3, 4, 5};
auto future = QtConcurrent::mappedReduced<int>(arr, [](auto item) {
    return item;
}, [](int& result, auto item) {
    result += item;
});

正如您所看到的,传递给QtConcurrent::mappedReduced的第一个lambda表达式看起来不必要。这就是为什么我想在Qt6中找到像QtConcurrent::reduced这样的东西。或者我如何重构这段代码,使其只使用一个λ表达式?

EN

回答 1

Stack Overflow用户

发布于 2021-05-24 02:22:57

您可以使用std::accumulate

QtConcurrent mappedReduce的目标是以并发方式在容器的所有项上应用操作,并在完成后执行缩减。

在您的例子中,除了项目的总和之外,没有什么可做的,所以不需要mappedReduce。

更新

根据您的评论,下面是一个使用自定义类的示例,其中使用QList作为容器重载了operator+

代码语言:javascript
复制
class MyClass
{
public:
    MyClass(int x=0, int y=0):
       _x(x),
       _y(y)
    {}

    int x() const { return _x; }
    int y() const { return _y; }

public:
    int _x;
    int _y;
};

MyClass operator+(const MyClass& left, const MyClass &right)
{
    MyClass m;
    m._x = left._x + right._x;
    m._y = left._y + right._y;
    return m;
}

这是一个带有std::accumulate的版本

代码语言:javascript
复制
#include <QVector>
#include <QtDebug>
#include <numeric>

int main(int argc, char **argv)
{
    Q_UNUSED(argc);
    Q_UNUSED(argv);

    QVector<MyClass> myClassList = {MyClass(12, 42), MyClass(23, 53)};
    MyClass result = std::accumulate(myClassList.constBegin(), myClassList.constEnd(), MyClass());
    qDebug() << result.x() << result.y();
    return 0;
}

更新2:

代码语言:javascript
复制
#include <QtDebug>
#include <QVector>
#include <QtConcurrent>
#include <numeric>

MyClass myAccumulate(const QVector<MyClass> &input)
{
    return std::accumulate(input.constBegin(), input.constEnd(), MyClass());
}

int main(int argc, char **argv)
{
    Q_UNUSED(argc);
    Q_UNUSED(argv);

    QVector<MyClass> myClassList = {MyClass(12, 42), MyClass(23, 53)};
    QFuture<MyClass> future = QtConcurrent::run(myAccumulate, myClassList);
    result = future.result();
    qDebug() << result.x() << result.y();
    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67460898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档