c++有一种方法可以将优先级队列元素复制到vector中,这样就可以对其进行迭代以检查是否有重复项
c++ is there a way to copy priority queue elements into a vector so it can be iterated to check for duplicates
我第一次尝试在c++中编写A*搜索,但我以前在Java中编写过它们。
我在检查是否已经在openList中有问题。OpenList是Node的priority_queue,但我知道你不能简单地遍历一个优先级队列。
我的想法是,我将openList传递给一个函数,该函数将元素复制到临时向量中,然后我可以迭代这个临时向量。这显然不利于快速高效的运行,但我想不出其他解决办法。
闭链表非常简单,你可以看到只是遍历vector。
这是两个列表:
priority_queue<Node, vector<Node>, NodeCompare> openList;
vector<Node> closedList;
代码:bool checkInClosedList(std::vector<Node>& v,int x, int y){
for (std::vector<Node>::iterator iter = v.begin(); iter != v.end(); ++iter) {
if(iter->getX() == x && iter->getY() == y){
return true;
}
}
return false;
}
我怎么能做到以上,但对于一个priority_queue <Node, vector<Node>, NodeCompare>
?
优先级队列本身工作得很好,我已经测试过了,但我的A*陷入无限循环,因为它一直在检查它已经检查过的节点!
欢呼,克里斯。
底层数据容器是类的受保护成员std::priority_queue
,因此您可以在派生类中访问它。如果要添加前置或后置条件或不变量,请使用是正确的解决方案;你派生你自己的类强制不变量。
您可以使用std::list并对其调用unique()。此外,std::list允许您基于谓词进行排序,这将允许您模拟priority_queue正在进行的任何排序。
或者,std::map强制唯一键,并将删除重复键。
相关文章:
- 如何修复艺术ASCII,我点击一个字母就可以了,但输入一个阶段艺术出来了
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 仅捕获异常就可以检测所有二进制文件在C 中读取错误是否足够
- 为什么仅 -fno-signed-0 就可以实现优化,而似乎也需要 -ffinite-math-only (gcc)
- 执行运算符在指针上无需取消就可以使用
- 我应该把Boost.Python的.so文件放在哪里,这样我就可以把它作为一个模块导入,以及我如何将它与Python 2
- 当函数有很多参数和客户端代码只需更改其中时,如何处理情况就可以处理
- 为什么在间接使用基类 typedef 时不断出现语法错误,而直接使用它就可以了?
- Cython代码可以编译成dll吗?这样C++应用程序就可以调用它了
- 仅仅使用(稳定的)第三方库就可以使我的代码无法工作
- 为什么GCC只需将未定义的行为放入循环中就可以允许它
- C++中需要什么,这样我们就可以始终使用引用而从不使用指针
- 将CUDA中的缓冲加倍,这样CPU就可以对持久化内核产生的数据进行操作
- 在Mac OS X上共享一个c++库,这样我就可以在mySQL中添加用户定义的函数
- 将一个char数组传递给函数模板,这样gcc就可以判断出它是一个字面量
- 我如何发送一个unix-exe给我的朋友,这样他就可以通过双击运行它
- 是否有可能钩全局窗口的创建,这样我就可以控制窗口放置在屏幕上的位置
- 如何解除对RenderTarget纹理的绑定,这样它就可以被用作下一个通道的输入
- 为什么在初始化列表中不需要创建额外的副本就可以对数据进行赋值
- c++有一种方法可以将优先级队列元素复制到vector中,这样就可以对其进行迭代以检查是否有重复项