考虑以下代码(Qt 6.0.3,C++17):
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这样的东西。或者我如何重构这段代码,使其只使用一个λ表达式?
发布于 2021-05-24 02:22:57
您可以使用std::accumulate。
QtConcurrent mappedReduce的目标是以并发方式在容器的所有项上应用操作,并在完成后执行缩减。
在您的例子中,除了项目的总和之外,没有什么可做的,所以不需要mappedReduce。
更新
根据您的评论,下面是一个使用自定义类的示例,其中使用QList作为容器重载了operator+。
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的版本
#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:
#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;
}https://stackoverflow.com/questions/67460898
复制相似问题