Cython 中带有自定义比较器的优先级队列
A Priority queue with a custom comparator in Cython
我知道已经有 个问题得到了回答,但我似乎无法解决这个问题。
我目前正在尝试使用 pair[double,pair[int,int]] 的 PriorityQueue 并使用 pair (pair.first) 的双精度对自身进行排序。
如果这有帮助,方法是这个:pathfind(pair[int,int] start, pair[int,int] goal, np.ndarray grid),第一个和第二个参数是从正常 python 方法,网格只是一个二维数组。
那么...在 Cython 中创建 pair[double,pair[int,int]] 的 PriorityQueue 并使其比较成对中的第一个事物(双)的最佳方法是什么?
它输出的错误是这样的:error C2955: 'cpp_pq': use of alias template requires template argument list
cpp_priority_queue.hpp代码是这样的:
#include <functional>
#include <queue>
template <class T> //Had to use this since pair wasn't getting imported correctly with <utilities>
using cpp_pq = std::priority_queue<T,std::vector<T>,std::function<bool(T,T)>>;
.pyx 代码的一部分是这样的:
cdef extern from "cpp_priority_queue.hpp":
cdef cppclass cpp_pq:
cpp_pq(...) except +
void push(pair[double,pair[int,int]])
pair[double,pair[int,int]] top()
void pop()
bool empty()
cdef bool compare_element(pair[double,pair[int,int]] a, pair[double,pair[int,int]] b):
return a.first < b.first
cpdef int pathfind(pair[int,int] start, pair[int,int] goal, np.ndarray grid): # it supposed to output a
# list of tupples, but its
# an int for now until this
# works
cdef cpp_pq queue = cpp_pq(compare_element)
cdef pair[double,pair[int,int]] p = (05.7,start) # some random stuff here for testing....
queue.push(p)
##nothing here till this works...
return 0
我终于解决了这个问题,我重新启动了项目,而不是复制 .hpp 文件,而是重写了它,它非常有效。
由于某种原因,起初实用程序库显示错误(红色下划线字),所以我一直重写代码,直到我自己设法破坏它并添加了不必要的模板。
直到我放弃并重新启动一切才奏效。
最终的 cpp_priority_queue.hpp 文件是这样的:
#include <functional>
#include <queue>
#include <utility>
using cpp_pq = std::priority_queue<std::pair<double,std::pair<int,int>>,std::vector<std::pair<double,std::pair<int,int>>>,std::function<bool(std::pair<double,std::pair<int,int>>,std::pair<double,std::pair<int,int>>)>>;
.pyx 文件格式正确,问题出在 .hpp 文件上。
我知道已经有
我目前正在尝试使用 pair[double,pair[int,int]] 的 PriorityQueue 并使用 pair (pair.first) 的双精度对自身进行排序。 如果这有帮助,方法是这个:pathfind(pair[int,int] start, pair[int,int] goal, np.ndarray grid),第一个和第二个参数是从正常 python 方法,网格只是一个二维数组。 那么...在 Cython 中创建 pair[double,pair[int,int]] 的 PriorityQueue 并使其比较成对中的第一个事物(双)的最佳方法是什么?
它输出的错误是这样的:error C2955: 'cpp_pq': use of alias template requires template argument list
cpp_priority_queue.hpp代码是这样的:
#include <functional>
#include <queue>
template <class T> //Had to use this since pair wasn't getting imported correctly with <utilities>
using cpp_pq = std::priority_queue<T,std::vector<T>,std::function<bool(T,T)>>;
.pyx 代码的一部分是这样的:
cdef extern from "cpp_priority_queue.hpp":
cdef cppclass cpp_pq:
cpp_pq(...) except +
void push(pair[double,pair[int,int]])
pair[double,pair[int,int]] top()
void pop()
bool empty()
cdef bool compare_element(pair[double,pair[int,int]] a, pair[double,pair[int,int]] b):
return a.first < b.first
cpdef int pathfind(pair[int,int] start, pair[int,int] goal, np.ndarray grid): # it supposed to output a
# list of tupples, but its
# an int for now until this
# works
cdef cpp_pq queue = cpp_pq(compare_element)
cdef pair[double,pair[int,int]] p = (05.7,start) # some random stuff here for testing....
queue.push(p)
##nothing here till this works...
return 0
我终于解决了这个问题,我重新启动了项目,而不是复制 .hpp 文件,而是重写了它,它非常有效。 由于某种原因,起初实用程序库显示错误(红色下划线字),所以我一直重写代码,直到我自己设法破坏它并添加了不必要的模板。 直到我放弃并重新启动一切才奏效。
最终的 cpp_priority_queue.hpp 文件是这样的:
#include <functional>
#include <queue>
#include <utility>
using cpp_pq = std::priority_queue<std::pair<double,std::pair<int,int>>,std::vector<std::pair<double,std::pair<int,int>>>,std::function<bool(std::pair<double,std::pair<int,int>>,std::pair<double,std::pair<int,int>>)>>;
.pyx 文件格式正确,问题出在 .hpp 文件上。