我有以下代码,除了cdef extern
(*)的unique
以外,其他所有代码都正常运行:
from libc.stdint cimport uint32_t
from libcpp.vector cimport vector
ctypedef struct interval:
uint32_t start
uint32_t end
ctypedef vector[uint32_t] intvec
ctypedef vector[interval] interval_vector
cdef uint32_t start_end_equal(interval lhs, interval rhs):
if ((lhs.start == rhs.start) and (lhs.end == rhs.end)):
return <uint32_t> 1
else:
return <uint32_t> 0
cdef extern from "<algorithm>" namespace "std":
iterator unique(...)
cdef test(interval_vector intervals):
intervals.erase(unique(intervals.begin(), intervals.end(), start_end_equal))
上述代码的问题是
错误Error compiling Cython file:
------------------------------------------------------------
...
else:
return <uint32_t> 0
cdef extern from "<algorithm>" namespace "std":
iterator unique(...)
^
------------------------------------------------------------
minimal_example.pyx:21:4: 'iterator' is not a type identifier
在哪里可以找到用于标注函数的迭代器类型?
还感谢其他解决方法:)
(*)如果您想知道为什么我根本不使用from libcpp.algorithm cimport unique
,请参阅this related q
答案 0 :(得分:1)
我已经回答了这个in your related question,因为它出现在评论中。张贴在这里,所以这个问题有一个答案(但是社区维基百科,所以两次都没有从同一件事获得声誉)。
您的选择是让迭代器类型成为模板参数(而未指定函数参数):
cdef extern from "<algorithm>" namespace "std":
Iter unique[Iter](Iter, Iter, ...)
或者,您可以尝试将其限制为特定的向量迭代器类型。您的情况是vector[interval].iterator
。这是在Cython中包装成向量内的嵌套类型。