Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/jquery-mobile/2.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
Qt 循环在selectedItems()上迭代的性能_Qt_Qgraphicsscene - Fatal编程技术网

Qt 循环在selectedItems()上迭代的性能

Qt 循环在selectedItems()上迭代的性能,qt,qgraphicsscene,Qt,Qgraphicsscene,我在将项目设置为选定项时遇到问题。。。所以我看了一眼qgraphicscene::selectedItems() 从那以后,我对在循环中使用它感到非常紧张 在这样的构造中: foreach(QGraphicsItem* selectedItem, selectedItems()) { // perform action with selectedItem } 每次迭代都会重新计算selectedItems()函数吗? (我认为是这样,因为如果在循环中我更改选择,上述内容将变得不稳定)

我在将项目设置为选定项时遇到问题。。。所以我看了一眼
qgraphicscene::selectedItems()

从那以后,我对在循环中使用它感到非常紧张

在这样的构造中:

foreach(QGraphicsItem* selectedItem, selectedItems())
{ 
    // perform action with selectedItem
}
每次迭代都会重新计算
selectedItems()
函数吗?
(我认为是这样,因为如果在循环中我更改选择,上述内容将变得不稳定)

我想这会对我的代码速度产生很大影响

因此,我开始在任何地方更改我的代码,以:

QList<QGraphicsItem*> sel = selectedItems();
foreach(QGraphicsItem* selectedItem, sel)
{ 
    // perform action with selectedItem
}
QList sel=selectedItems();
foreach(QGraphicsItem*selectedItem,sel)
{ 
//使用selectedItem执行操作
}
我认为这会加快程序的速度,对吗?
(或者,如果我错了,并且
selectedItems()
没有真正完成所有代码,那么它会因为复制而使测试速度变慢,而替换的循环测试不会改变吗?)

我想知道应该避免什么其他功能。。。对于从
QGraphicsItem
继承的项,可能类似于或
boundingRect()
。。。。如果在同一功能中多次使用,则将其复制到
QRectF
是否正确

foreach(QGraphicsItem* selectedItem, selectedItems())
{ 
    // perform action with selectedItem
}
在本例中,您正在迭代返回的选定项,并且正如您所发现的,如果更改了选定项,则可能会导致问题

这样更好吗

QList<QGraphicsItem*> sel = selectedItems();
foreach(QGraphicsItem* selectedItem, sel)
{ 
    // perform action with selectedItem
}
QList sel=selectedItems();
foreach(QGraphicsItem*selectedItem,sel)
{ 
//使用selectedItem执行操作
}
简单的答案是肯定的

它会因为复制而变慢吗

不一定。如果容器保持不变,则不会产生任何影响

但是,Qt实现了,这确保了在这种情况下,容器(如QList)将共享数据,并且仅在其中一个副本发生更改时创建一个副本(COW-copy on write)


我不太担心
scenestribut
boundingRect
,因为它们只返回简单的数据类型,比如
QRectF
,而不是一个项目容器,所以这里不需要隐式共享。只有在极端情况下,缓存这些返回值才会产生明显的差异。

foreach只调用selectedItems()一次,并保留返回值的副本,因此第二次实现不会加快程序的速度。此外,如果要加快程序的速度,我建议下载一个分析工具,在考虑做任何其他事情之前,使用它来定位处理时间的去向。隐式共享不意味着如果容器不更改,复制速度会更快吗?但我不会调用函数来计算每次迭代的选择,所以隐式共享意味着绝对更快。。。。至于
boundingRect()
,对于像
QGraphicsSvgItem
QGraphicsTextItem
这样的项目,它们确实可以获得它,缓存到一个简单的类型,如
QRectF
,而不是调用重新计算矩形的函数。。。。我假设它们都是简单的类型,一看代码我就开始担心了。Lol。你不会每次迭代都调用这个函数。查阅foreach的文档。我不知道为什么海报上说第二个实现更好,它们实际上都做了相同的事情,除了第二个可能会制作列表的额外(浅)副本,但这就像是一个指针大小的存储,因此可以忽略,而且编译器可能会优化这个。这样做会更好的唯一原因是它可以避免混淆。