Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ 8难题:按成员变量对包含指向对象的指针的STL堆/优先级队列进行排序_C++_Stl_Sliding Tile Puzzle - Fatal编程技术网

C++ 8难题:按成员变量对包含指向对象的指针的STL堆/优先级队列进行排序

C++ 8难题:按成员变量对包含指向对象的指针的STL堆/优先级队列进行排序,c++,stl,sliding-tile-puzzle,C++,Stl,Sliding Tile Puzzle,我正致力于实现一个最佳优先搜索算法来解决一个作业的8字谜问题。根据要求,必须使用标准模板库(STL)中的(最小)优先级队列或堆来实现 我理解,使用任一数据结构以最佳启发式成本(即最小成本)组织扩展的谜题状态都是有用的 从3x3矩阵开始(使用阵列实现) 每个新的拼图状态(对象)都是使用以下方法创建的: Puzzle *next=(current->moveDown()); Puzzle *next=(current->moveRight()); Puzzle *next=(curre

我正致力于实现一个最佳优先搜索算法来解决一个作业的8字谜问题。根据要求,必须使用标准模板库(STL)中的(最小)优先级队列或堆来实现

我理解,使用任一数据结构以最佳启发式成本(即最小成本)组织扩展的谜题状态都是有用的


从3x3矩阵开始(使用阵列实现)

每个新的拼图状态(对象)都是使用以下方法创建的:

Puzzle *next=(current->moveDown());
Puzzle *next=(current->moveRight());
Puzzle *next=(current->moveUp());
Puzzle *next=(current->moveRight());
我想
。将(下一个)
推到(最小)优先级队列或堆(属于
Puzzle*
),按照
next->FCost
排序



一般来说,是否有一种方法可以使用这些STL数据结构中的任何一种来包含指向对象的指针—按特定于每个对象的成员变量(FCost)排序?

是的,您可以为每个对象指定自定义比较函数

auto-cmp=[](拼图*a,拼图*b){
返回a->FCost>b->FCost;
};
std::优先级队列(cmp);

是的,您可以为

auto-cmp=[](拼图*a,拼图*b){
返回a->FCost>b->FCost;
};
std::优先级队列(cmp);

您可以使用带有
优先级\u队列的自定义排序功能
。(您可以对所有有序集合执行此操作。)不相关,但我不明白为什么需要动态分配current。看见我建议只需
拼图当前(初始,目标)
。当然,您的其他变量可能指向该堆栈变量,例如
Puzzle*next=current.moveDown()经验法则是,如果不立即将其包装到资源处理类中,不要编写
new
,例如
std::unique_pointer current=std::make_unique(new Puzzle(initial,goal))
。您可以使用带有
优先级\u队列的自定义排序功能
。(您可以对所有有序集合执行此操作。)不相关,但我不明白为什么需要动态分配current。看见我建议只需
拼图当前(初始,目标)
。当然,您的其他变量可能指向该堆栈变量,例如
Puzzle*next=current.moveDown()经验法则是,如果不立即将其包装到资源处理类中,不要编写
new
,例如
std::unique_pointer current=std::make_unique(new Puzzle(initial,goal))
Puzzle *next=(current->moveDown());
Puzzle *next=(current->moveRight());
Puzzle *next=(current->moveUp());
Puzzle *next=(current->moveRight());
auto cmp = [](Puzzle* a, Puzzle* b) { 
    return a->FCost > b->FCost;
};

std::priority_queue<Puzzle*, std::vector<Puzzle*>, decltype(cmp)> queue(cmp);