如何从<algorithm>赛通实习
How to extern from <algorithm> in Cython
我正在尝试使用 Cython 中<algorithm>
库中的partial_sort
,但我只是找不到正确extern
它的正确方法。
参考
这是我失败的尝试:
%%cython -f
cdef extern from "<algorithm>" namespace "std":
void partial_sort[RandomAccessIterator](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
void partial_sort[RandomAccessIterator, Compare](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp)
使用 Cython 0.19.1 时出现错误消息:
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "<algorithm>" namespace "std":
cdef cppclass RandomAccessIterator:
cppclass Compare
void partial_sort[RandomAccessIterator]
^
------------------------------------------------------------
/Users/richizy/.ipython/cython/_cython_magic_cf4fbe14563c3de19c8c3af3253a182e.pyx:5:46: Not allowed in a constant expression
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "<algorithm>" namespace "std":
cdef cppclass RandomAccessIterator:
cppclass Compare
void partial_sort[RandomAccessIterator]
^
------------------------------------------------------------
/Users/richizy/.ipython/cython/_cython_magic_cf4fbe14563c3de19c8c3af3253a182e.pyx:5:46: Array dimension not integer
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from "<algorithm>" namespace "std":
cdef cppclass RandomAccessIterator:
cppclass Compare
void partial_sort[RandomAccessIterator]
^
------------------------------------------------------------
/Users/richizy/.ipython/cython/_cython_magic_cf4fbe14563c3de19c8c3af3253a182e.pyx:5:25: Array element type 'void' is incomplete
使用 Cython 0.20.1 时出现错误消息:
CompileError: command 'gcc' failed with exit status 1
warning: .ipython/cython/_cython_magic_121a91d1fdd64d85c4b01e6540fd86d6.pyx:4:52: Function signature does not match previous declaration
编辑:截至 14 年 2 月 22 日,对于 Cython 0.20.1
https://groups.google.com/forum/#!topic/cython-users/H4UEM6IlvpM
正确,Cython 不支持默认模板专用化(对于 函数或类)。它也不支持非类型名称模板 参数(没有一些黑客攻击)。 两者都缺少以下功能 我们希望有一天能到达。
- 罗伯特
似乎 Cython 不能很好地与模板专业化配合使用。以下代码对我有用(Cython 版本 0.20,Python 2.7.5,g++ (SUSE Linux) 4.8.1)
from libcpp.vector cimport vector
cdef extern from "<algorithm>" namespace "std":
void partial_sort[RandomAccessIterator](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
# void partial_sort[RandomAccessIterator, Compare](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp)
cpdef bla():
cdef vector[int] v
cdef int i = 0
cdef list res = []
v.push_back(4)
v.push_back(6)
v.push_back(2)
v.push_back(5)
partial_sort[vector[int].iterator](v.begin(), v.end(), v.end())
for i in v:
res.append(i)
return res
然后
>>> import bla
>>> bla.bla()
[2, 4, 5, 6]
但是取消注释该行会断开代码
bla.pyx:15:16: Wrong number of template arguments: expected 2, got 1
下面是一个解决方法:使用两个不同的名称声明模板函数的不同专用化:
cdef extern from "<algorithm>" namespace "std":
void partial_sort_1 "std::partial_sort"[RandomAccessIterator](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
void partial_sort_2 "std::partial_sort"[RandomAccessIterator, Compare](RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp)
然后你使用正确的一个,如:
partial_sort_1[vector[int].iterator](v.begin(), v.end(), v.end())
注意:我从Cython用户那里得到,这是一个已知的问题,并且在Cython上拥有模板部分专用化暂时在他们的愿望清单上。
相关文章:
- EASTL矢量<向量<int>>连续的
- C++ <algorithm> 使用对象作为比较定义的 sort()
- TicTacToe with MiniMax algorithm 4x4
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- is_permutation方法从 #include<algorithm> 显示错误的输出
- 设置::查找和查找之间的性能差异<algorithm>
- Stringholics algorithm
- Next_Permutation algorithm
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 我不使用<algorithm>标题,但 sort() 可用
- std::max在包含<algorithm>后无法解析
- C 字符串比较“祝您好运”&gt;“再见”
- <algorithm> 定义宏 X 吗?
- 在 C++ <algorithm>中查找函数
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 我可以打电话给<algorithm>空旷的设施吗?
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时