gpt4 book ai didi

c++ - QtConcurrent::map 和指针列表

转载 作者:行者123 更新时间:2023-11-28 06:45:21 27 4
gpt4 key购买 nike

我在网上找到了一些引用文献,其中人们说这行不通,但他们从未解释过为什么这行不通。

在伪代码中我正在做这样的事情:

void MyObject::doWork() {
QList<Item *> worklist;
for ( int i = 0; i < nitems; i++ ) {
Item *item = getItem(i);
if (item->isVisible()) {
worklist.prepend(item);
} else {
worklist.append(item);
}
}
QtConcurrent::map(worklist, procfunc);
}

本质上,创建一个要处理的对象列表,并将更重要的对象放在列表的前面。然后让每个项目都得到处理,希望能利用系统中的内核数量。

我可以打印 worklist 的内容,它包含一堆看起来合理的指针。我可以遍历列表,在每个项目上显式调用 QtConcurrent::run,并且效果很好。

使用QtCuncurrent::map 接口(interface),procfunc 不获取指针,它获取一些随机数据。我已经尝试了两种不同的 procfunc 声明(没有警告,它告诉你一些关于这个接口(interface)的类型安全的信息):

   static void profunc(Item *);
static void profunc(Item *&); // Probably correct given the API definition

所有示例都创建一个对象列表,而不是指向对象的指针。这些对象通常实现 Qt 的“写时复制”语义,但这在我的应用程序中并没有多大意义。

这可能吗?如果是这样,我做错了什么?如果不是,有人可以解释发生了什么使得这不可能吗?

最佳答案

如果您足够仔细阅读,文档会说明这一点。类似的接口(interface)有两个,QtConcurrent::map 和 QtConcurrent::mapped:

QtConcurrent::mapped() takes an input sequence and a map function. This map function is then called for each item in the sequence, and a new sequence containing the return values from the map function is returned.

...

If you want to modify a sequence in-place, use QtConcurrent::map().

这里的关键是这会修改序列

我最初读到的是“map”修改了对象,“mapped”制作了对象的新拷贝……但事实上,这些接口(interface)的不同之处在于顺序,而不是对象。在我的代码中,序列超出了范围,因为我假设它是在 QtConcurrent 内部处理的,但由于我使用的是应该就地修改序列的接口(interface),这不可能是真的。因此所有的虚假数据。

这意味着对于我尝试做的工作来说,这是错误的 API。

关于c++ - QtConcurrent::map 和指针列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25113916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com