Cython中C++ vector指针a[0]返回整个向量而非首元素的疑问
Cython中vector指针下标访问的异常行为解析
你遇到的问题核心是对指针下标运算和C++ vector容器的下标访问的概念混淆:
你的
a是vector[double]*类型,也就是指向vector对象的指针。在C/C++(包括Cython对C++的绑定)中,a[0]等价于*a,也就是对指针解引用,得到的是整个vector对象本身,而不是vector内部的第一个元素。Cython在打印vector对象时,会默认输出整个容器的所有元素,所以你看到的是完整的a_high向量。如果要获取
vector的第一个元素,需要先解引用指针得到vector对象,再用vector自己的下标运算符访问元素,有几种写法:- 先解引用指针,再访问元素:
(*a)[0] - 利用指针下标得到vector对象后再访问元素:
a[0][0] - 使用C++ vector的
at()方法(带越界检查):a->at(0)
- 先解引用指针,再访问元素:
修改后的代码示例:
from libcpp.vector cimport vector cdef vector[double] a_low = [1.0, 2e-03, -4e-07, 6.3e-10, -2.21e-5, -3.45e+01]; cdef vector[double] a_high = [-2.21e-01, 4.1e-03, -6.12e-02, 1.65e-09, -9.3e-6, -1.4e+02]; def h_calc(double T): cdef vector[double] *a cdef double h if (T<1000.0): a = &a_low; else: a = &a_high; print((*a)[0]) # 输出第一个元素 h = 0.0; return h;
执行h_calc(1200);后,就会输出-0.221,也就是a_high的第一个元素。
内容的提问来源于stack exchange,提问作者mo adib
相关产品推荐
相关产品推荐

