2017-06-06 17 views
0

cpp listをcythonで初期化し、値を設定してリストを反復してその値を取得したいとします。一般的なコードは次のようになります。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] 

をしかし、私はこれをコンパイルするとき、私はエラーを取得する:私はそれはへの道だろうと思った彼らは、CPPベクトルhereを反復方法を考える

Indexing list[int] not supported for index type int

行く。

答えて

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

intは、システムバスサイズに制限されていません.C++のリストは、索引付けとして別のintを使用しています(最大32/64ビットの容量を持つint)。 ctypes.c_intが動作するはずです。

+0

私はそれを試してみたいと思いますが、 'ctypes.c_int'をcythonにどのようにインポートするのですか? – user3820991

関連する問題