我使用最新的带有C++17标志的Cython (在C++11上面有闭包语法)到GCC。Cython中的C++排序似乎不允许闭包:
# File: myfunc.pyx
from libcpp.vector cimport vector
from libcpp.algorithm cimport sort
# cpdef to call from Python, it just wraps cdef anyway
cpdef myfunc():
# int is just example, I need to sort struct vector
cdef vector[int] v
v.push_back(2)
v.push_back(1)
# Compile error: Expected ')', found 'a'
sort(v.begin(),v.end(), [](int a,int b){
return a<b
})是否支持C++闭包,以及如何使用?如何使用闭包进行C++排序,因为我正在将Python移植到Cython,并且有很多lambda类。
发布于 2021-11-05 08:22:52
在这种情况下,您实际上不需要一个“闭包”--您不需要从周围的作用域捕获任何变量。因此,对于特定的示例,可以使用cdef函数(必须在全局范围内定义):
cdef bool compare(double a, double b):
return a<b
sort(v.begin(),v.end(), compare)这显然不是一个普遍的解决办法。但是,很多时候,传递指向C函数的指针确实是您所需要的。
发布于 2021-11-05 01:08:25
我试图搜索和修改代码,但这是唯一的方法:
的“排序”函数
使用.hpp标头(如果不使用C++标头,.h也可以)
没有C++闭包语法在Cython中,根据我的互联网搜索,使用结构与运算符重载代替。
# File: mycmp.hpp
struct cmp {
bool operator()(int a,int b){ return a<b; }
};# File: myfunc.pyx
cdef extern from "mycmp.hpp":
cdef struct cmp:
bool "operator()"(int a,int b)
cdef vector[int] v
v.push_back(2)
v.push_back(1)
cdef cmp compare
sort(v.begin(),v.end(), compare)
print(v)使用Python的“排序”函数
因为.sort不在vector上,所以使用sorted函数代替。这要简单得多,但对于其他类型的lambda来说,可能不适用。
v = sorted(v, key=lambda x: x) # x or some prop of xhttps://stackoverflow.com/questions/69847204
复制相似问题