如何在 Cython 中执行与以下C ++代码等效的操作?
typedef vector<double> dvec;
dvec *arr = new dvec[n]; // n is an unsigned int (unknown at compile time)
// do something with arr; for example...
arr[0].push_back(10);
cout << arr[0][0] << endl;
我试图为n个向量分配内存,但是后来我不知道如何在Cython中进行新的放置。任何帮助将不胜感激。
答案 0 :(得分:3)
您似乎无法在Cython中进行新数组(new something[n]
)的数组。最简单的解决方案是创建1行C ++函数来进行数组的新建和数组的删除,然后调用它们。
template <typename T>
T* array_new(int n) {
return new T[n];
}
template <typename T>
void array_delete(T* x) {
delete [] x;
}
从以下Cython文件中调用
# distutils: language = c++
from libcpp.vector cimport vector
ctypedef vector[double] dvec
cdef extern from "cpp_funcs.hpp":
T* array_new[T](int)
void array_delete[T](T* x)
def example(int n):
cdef dvec* arr = array_new[dvec](n)
try:
if n>0:
arr[0].push_back(10)
print(arr[0][0])
finally:
array_delete(arr)
鉴于Cython对C ++的支持是有限的,并且在某些地方很尴尬(并且考虑到无论如何都要使用C ++),我认为编写少量C ++代码通常是一个合理的解决方案,并可以节省很多时间。某些人似乎想不惜一切代价避免这种情况。...
我仍然建议您使用向量向量(vector<vector<double>>
),因为您可以免费获得内存管理。最好还是坚持使用Python类型并使用numpy数组列表,但是如果要与外部C ++代码进行接口,那可能不合适。
答案 1 :(得分:3)
作为@DavidW答案的补充:自Cython 0.28起,有一个允许verbatim C-code的新功能。它的优点是可以无缝使用这种小型C / C ++包装器:
cdef extern from *:
"""
template <typename T>
T* array_new(int n) {
return new T[n];
}
template <typename T>
void array_delete(T* x) {
delete [] x;
}
"""
T* array_new[T](int)
void array_delete[T](T* x)
from libcpp.vector cimport vector
.... and so on
无需创建外部头文件。