2017-06-06 75 views
0

我想在cython中啓動一個cpp list,賦值給它,然後迭代列表以獲取它的值。一個通用的代碼看起來是這樣的:cython - 如何迭代C++列表

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] 

然而,當我編譯此我得到的錯誤:

Indexing list[int] not supported for index type int

鑑於他們遍歷CPP載體here的方式,我認爲這將是途徑走。

回答

1

C++ std::list s是雙向鏈表(即每個元素都有一個指向下一個和前一個元素的指針),這使得添加/插入元素有效,但意味着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()進行比較,以查看您何時到達列表的末尾。既然你應該知道這裏的長度,我還沒有這樣做。

+0

代碼目前我沒有測試過,所以可能會有小問題。它的要點是正確的! – DavidW

0

Python中的int不受限於系統總線大小,C++中的列表使用另一個int作爲索引,這是一個最大容量爲32/64位的int。 ctypes.c_int應該可以工作。

+0

我想嘗試一下,但如何將'ctypes.c_int'導入到cython中? – user3820991