C++中的QHashIterator
Posted
技术标签:
【中文标题】C++中的QHashIterator【英文标题】:QHashIterator in c++ 【发布时间】:2015-08-17 15:36:07 【问题描述】:我用 C++ 开发了一个游戏,并希望确保一切都正确完成。 使用 QHashIterator 检查列表中的哪个项目具有最低值(寻路的 F 成本)是否是一个好的解决方案。
我的代码片段:
while(!pathFound) //do while path is found
QHashIterator<int, PathFinding*> iterator(openList);
PathFinding* parent;
iterator.next();
parent = iterator.value();
while(iterator.hasNext()) //we take the next tile, and we take the one with the lowest value
iterator.next();
//checking lowest f value
if((iterator.value()->getGcost() + iterator.value()->getHcost()) < (parent->getGcost() + parent->getHcost()))
parent = iterator.value();
if(!atDestionation(parent,endPoint)) //here we check if we are at the destionation. if we are we return our pathcost.
clearLists(parent);
filllists(parent,endPoint);
else
pathFound = true;
while(parent->hasParent())
mylist.append(parent);
parent = parent->getParent();
pathcost = calculatePathCost(mylist); //we calculate what the pathcost is and return it
如果没有?有更好的改进吗?
我还发现了一些关于 std::priority_queue 的信息。它比 QHashIterator 更好吗?
在游戏世界不大的情况下,这可能不是问题。但是当游戏世界很大时(例如 + 10000 次计算),我正在寻找合适的解决方案。任何标记?
【问题讨论】:
【参考方案1】:这里你基本上扫描整个地图以根据一些值找到最小的元素:
while(iterator.hasNext()) //we take the next tile, and we take the one with the lowest value
iterator.next();
//checking lowest f value
if((iterator.value()->getGcost() + iterator.value()->getHcost()) < (parent->getGcost() + parent->getHcost()))
parent = iterator.value();
如果您有一个 stl 容器,例如地图,所有这些代码都可以简化为:
auto parent = std::min_element(iterator.begin(), iterator.end(), [](auto& lhs, auto& rhs)
lhs.value()->getGcost() + lhs.value()->getHcost()) < (rhs.value()->getGcost() + rhs.value()->getHcost()
一旦你有了一些更容易理解的东西,你就可以使用不同的容器,例如在这种情况下保存一个排序的向量可能会更快。 )
您的代码本身并没有出现任何明显的问题,通常优化小循环并不能克服性能提升,更多的是您的代码是如何组织的。例如,我看到您有很多间接寻址,这些间接寻址在缓存未命中方面付出了很多代价。或者,如果您必须始终找到最小元素,您可以将其缓存在另一个结构中,并且您可以一直拥有它。
【讨论】:
这可能是一个愚蠢的问题,但你所说的间接是什么意思? 我指的是iterator.value(),假设这个方法是一个指向其他结构的指针,但我猜它是Qt API的一部分,所以应该没有问题。跨度> 您编写的 stl 容器无法以这种方式使用它。那我应该删除 Qhashiterator 吗?并且只使用 STL 容器?QHash
公开 STL 迭代器。所有 Qt 容器都可以。从这个意义上说,它“是”一个 STL 迭代器。 :) 使某些东西成为“STL 迭代器”的所有因素都符合必要的概念。 QHash
做到了。
所以选择使用 QHash 迭代器不是一个坏事吗?我还使用 QList 仅插入我需要的节点。因为 QList 在插入项目时很慢,但在读出它们时很快。我以后在游戏中需要更多。以上是关于C++中的QHashIterator的主要内容,如果未能解决你的问题,请参考以下文章