Cython中通过指针初始化C++ STL vector编译报错如何解决
问题根因
你遇到的编译报错是Cython的重载解析逻辑匹配错了vector构造函数导致的:
你调用构造函数时传入了两个double*类型的指针,Cython没有正确匹配到接收迭代器范围的模板构造函数vector(InputIt first, InputIt last),反而匹配到了另一个重载vector(size_type count, const T& value):
- 第一个参数需要无符号整数类型
size_type,你传入的double*无法转换为该类型,对应第二个报错信息 - 第二个参数需要
double类型的元素值,你传入的double*无法转换,对应第一个报错信息
解决方案
两种常用修复方式可选:
方法1:显式声明指针变量后再构造
提前把首尾指针赋值给显式声明的double*变量,帮助Cython正确匹配迭代器构造函数:
from libcpp.vector cimport vector import numpy as np cimport numpy as cnp cnp.import_array() def foo(double[::1] a): cdef: double *start = &a[0] double *end = start + a.size vector[double] vec = vector[double](start, end) # 后续操作vec
注意:你需要确保编译Cython代码时指定了language='c++'参数,不管是写在setup.py里还是jupyter的cython魔术命令参数里,否则C++ STL的相关接口无法正常调用。
方法2:使用assign方法赋值(更稳妥)
先构造空vector,再调用assign方法传入指针范围,assign的迭代器重载匹配精度更高,不容易出现解析错误:
from libcpp.vector cimport vector import numpy as np cimport numpy as cnp cnp.import_array() def foo(double[::1] a): cdef vector[double] vec vec.reserve(a.size) # 可选,提前分配空间提升性能 vec.assign(&a[0], &a[0] + a.size) # 后续操作vec
内容的提问来源于stack exchange,提问作者Ronaldinho
相关产品推荐
相关产品推荐

