gpt4 book ai didi

c++ - cython - 如何迭代 C++ 列表

转载 作者:行者123 更新时间:2023-11-28 05:07:17 25 4
gpt4 key购买 nike

我想在 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]

但是,当我编译这个时,我得到了错误:

Indexing list[int] not supported for index type int

鉴于他们迭代 cpp vector 的方式 here我认为这就是要走的路。

最佳答案

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

# 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() 进行比较,以查看您何时到达列表末尾。因为你应该知道这里的长度,所以我没有这样做。

关于c++ - cython - 如何迭代 C++ 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com