首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cython:如何用闭包排序向量

Cython:如何用闭包排序向量
EN

Stack Overflow用户
提问于 2021-11-05 00:00:09
回答 2查看 100关注 0票数 0

我使用最新的带有C++17标志的Cython (在C++11上面有闭包语法)到GCC。Cython中的C++排序似乎不允许闭包:

代码语言:javascript
复制
# 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类。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-05 08:22:52

在这种情况下,您实际上不需要一个“闭包”--您不需要从周围的作用域捕获任何变量。因此,对于特定的示例,可以使用cdef函数(必须在全局范围内定义):

代码语言:javascript
复制
cdef bool compare(double a, double b):
    return a<b

sort(v.begin(),v.end(), compare)

这显然不是一个普遍的解决办法。但是,很多时候,传递指向C函数的指针确实是您所需要的。

票数 2
EN

Stack Overflow用户

发布于 2021-11-05 01:08:25

我试图搜索和修改代码,但这是唯一的方法:

  • 使用.hpp报头
  • 或使用Python

的“排序”函数

使用.hpp标头(如果不使用C++标头,.h也可以)

没有C++闭包语法在Cython中,根据我的互联网搜索,使用结构与运算符重载代替。

代码语言:javascript
复制
# File: mycmp.hpp
struct cmp {
    bool operator()(int a,int b){ return a<b; }
};
代码语言:javascript
复制
# 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来说,可能不适用。

代码语言:javascript
复制
v = sorted(v, key=lambda x: x) # x or some prop of x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69847204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档