QtConcurrent:映射和指针列表
QtConcurrent::map and list of pointers
我在网上找到了一些参考资料,人们说这不起作用,但他们从来没有给出为什么这不起作用的解释。
在伪代码中,我是这样做的: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
接口,procfunc
不得到指针,它得到一些随机数据。我尝试了procfunc
的两种不同声明(没有警告,它告诉您有关此接口的类型安全的一些信息):
static void profunc(Item *);
static void profunc(Item *&); // Probably correct given the API definition
所有的例子都创建了一个对象列表,而不是指向对象的指针。这些对象通常实现Qt的"写时复制"语义,但这在我的应用程序中并没有多大意义。
这可能吗?如果是这样,我做错了什么?如果不是,有人能解释一下发生了什么使这成为不可能吗?
如果你仔细阅读的话,文档中是这么说的。有两个类似的接口,QtConcurrent::map和QtConcurrent::mapped:
QtConcurrent::mapped()接受一个输入序列和一个映射函数。然后对序列中的每一项调用这个映射函数包含映射函数返回值的新序列为返回。
…
这里的关键短语是,这会修改序列。如果你想就地修改序列,使用QtConcurrent::map()。
我最初的读取是"map"修改了对象的位置,而"mapped"生成了对象的新副本…但事实上,在这些接口中不同的是顺序,而不是对象。在我的代码中,序列脱离了作用域,因为我假设它是在QtConcurrent内部处理的,但由于我使用的是应该在适当位置修改序列的接口,因此不可能是真的。因此所有的虚假数据。
这意味着这是错误的API的工作,我试图做的
如果Item有成员函数void Item::procMyself()
然后将其包装为void procfunc(Item*& item) { item->procMyself();}
,并使用QtConcurrent::map(worklist, procfunc);
如果你只有void procThat(Item* item)
,把它包装成void procfunc(Item*& item) { procThat(item);}
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将共享指针列表传递到pybind11中的c++对象
- C++:如何初始化包含具有给定键的指针列表的映射
- 使用继承的指针列表复制构造函数或重载运算符=
- 我应该如何在工厂类中存储弱指针列表?
- Qt单元测试:指针列表上的QCOMPARE函数
- 如何正确释放要配对的指针列表?
- 如何在 c++ 上对指针列表进行排序
- 从地图复制到指针列表
- 我对C 中共享指针列表进行排序的功能未完成类型
- const_iterator引用的指针列表
- 在 c++ 中生成字符串到 std::指针列表的映射
- 访问链表中的结构(带有指向其子实现的指针列表的树)
- 有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?
- 使用迭代器指针 (C++) 从对象指针列表中删除元素
- 无法列出定制类型的指针列表
- 创建指针列表的正确范例是什么
- 如何将指向指针列表的私有指针作为 const 返回
- C++填充指向指针**列表的指针,该列表指向指针地址