Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QtConcurrent::映射和指针列表_C++_Qt_Qt5 - Fatal编程技术网

C++ QtConcurrent::映射和指针列表

C++ QtConcurrent::映射和指针列表,c++,qt,qt5,C++,Qt,Qt5,我在网上找到了一些参考资料,人们说这不管用,但他们从来没有解释为什么这不管用 在伪代码中,我做了如下操作: void MyObject::doWork() { QList<Item *> worklist; for ( int i = 0; i < nitems; i++ ) { Item *item = getItem(i); if (item->isVisible()) { worklist.prepen

我在网上找到了一些参考资料,人们说这不管用,但他们从来没有解释为什么这不管用

在伪代码中,我做了如下操作:

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);
}
所有示例都创建对象列表,而不是指向对象的指针。这些对象通常实现Qt的“写时复制”语义,但这在我的应用程序中并没有多大意义


这可能吗?如果是,我做错了什么?如果没有,有人能解释一下是什么原因导致这一点不可能实现吗?

如果您仔细阅读,文档会这么说。有两个类似的接口,QtConcurrent::map和QtConcurrent::mapped:

QtConcurrent::mapped()接受一个输入序列和一个映射函数。 然后为序列中的每个项调用此映射函数,并 包含map函数返回值的新序列为 返回

如果要就地修改序列,请使用QtConcurrent::map()

这里的关键短语是,这修改了序列

我最初读到的是“地图”修改了对象的位置,“地图”制作了对象的新副本。。。但事实上,这些接口的不同之处在于顺序,而不是对象。在我的代码中,序列不在范围内,因为我假设它是在QtConcurrent内部处理的,但是因为我使用的接口应该在适当的位置修改序列,所以这不可能是真的。因此,所有的虚假数据


这意味着对于我尝试执行的作业,这是错误的API。

如果Item具有成员函数
void Item::procMy()

然后将其包装为
void procfunc(Item*&Item){Item->procmimf();}
并使用它
QtConcurrent::map(worklist,procfunc)


如果只有一个
void procThat(Item*Item)
,请将其包装为
void procfunc(Item*&Item){procThat(Item);}

你能通过制作一个完整的测试用例来完成你的例子吗?
worlist
变量的生存期是多少?
工作列表
变量是本地范围,在调用
QtConcurrent::map
后立即消失。我想这是问题的一部分。。。见下面我的答案。我从根本上误解了
QtConcurrent::map
是在修改序列,而不是序列中的对象。
   static void profunc(Item *);
   static void profunc(Item *&); // Probably correct given the API definition