Cython:从C ++为cdef extern函数提供类型迭代器

时间:2019-08-21 07:26:25

标签: cython

我有以下代码,除了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

1 个答案:

答案 0 :(得分:1)

我已经回答了这个in your related question,因为它出现在评论中。张贴在这里,所以这个问题有一个答案(但是社区维基百科,所以两次都没有从同一件事获得声誉)。

您的选择是让迭代器类型成为模板参数(而未指定函数参数):

cdef extern from "<algorithm>" namespace "std":
    Iter unique[Iter](Iter, Iter, ...)

或者,您可以尝试将其限制为特定的向量迭代器类型。您的情况是vector[interval].iterator。这是在Cython中包装成向量内的嵌套类型。