cython - 如何迭代c ++列表

时间:2017-06-06 14:11:35

标签: c++ cython

我想在cython中启动cpp list,为其赋值,然后遍历列表以获取其值。通用代码可能如下所示:

from libcpp.list cimport list as cpplist
from cpython cimport array
import array

cdef int[:] c_volumecheck(int n, int comb):

    cdef:
        array.array match = array.array('i', [0]*(n*comb))        
        int[:] match_c = match
        cpplist[int] arr

    asign(match_c, comb, n, arr)

    return match_c


cdef void asign(int[:] match, int row, int col, cpplist[int] arr):

    cdef int j, i

    for j in range(row):
        for i in range(col):
            arr.push_back(1)

    for j in range(row):
        for i in range(col):
            match[j*col + i] = arr[j*col +i]

但是,当我编译它时,我收到错误:

  

索引类型list[int]

不支持索引int

考虑到他们迭代cpp向量here的方式,我认为这将是要走的路。

2 个答案:

答案 0 :(得分:1)

C ++ std::list是双向链表(即每个元素都有指向下一个和前一个的指针),这使得添加/插入元素有效,但意味着Cython或C ++中不支持索引。相反,你应该使用迭代器协议:

# at top of file
from cython.operator import dereference, preincrement

# in function
cdef cpplist[int].iterator it

it = arr.begin()

for j in range(row):
    for i in range(col):
        match[j*col + i] = dereference(it)
        preincrement(it)

这也是(接近)你如何在C ++中进行迭代。

在更一般的情况下,您希望将迭代器与arr.end()进行比较,以查看何时到达列表末尾。既然你应该知道这里的长度,我还没有这样做。

答案 1 :(得分:0)

python中的int不受系统总线大小的限制,C ++中的列表使用另一个int作为索引,一个最大为32/64位容量的int。 WITH s as ( SELECT TOP 5 StudentId, ISNULL(SUM(Score),0) As HighScoreUser FROM (SELECT StudentId, Score FROM tbl_ActPoint UNION ALL SELECT StudentId, Score FROM tbl_EvaPoint ) s GROUP BY StudentId ORDER BY HighScoreUser DESC ) SELECT . . . FROM s JOIN othertable ot ON s.StudentId = ot.StudentId; 应该有用。