0

我正在使用 cython 来包装我的 C++ 类:

Foo.h

class Foo
{
private:
    std::map<int,int > myMap;
    std::vector<int> myVector;
public:
    // An example of internal structures initialization
    Foo()
    {
        for (int i=0; i<10; i++)
        {
             myVector.push_back(i);
             myMap[i]=i*i;
        }
    }
    std::map<int,int> getMyMap()
    {
        return myMap;
    }
    std::vector<int> getMyVector()
    {
        return myVector;
    }
}

我想知道是否有某种方法可以获得std::mapas pythondict和 std::vector as pythonlist而无需显式创建(从而浪费内存)此类结构的副本。

std::vector 的一个诱人的实现如下:

cdef extern from "Foo.h":
    cdef cppclass Foo:
    Foo()
    vector[int]  getMyVector()


cdef class pyFoo:
cdef Foo *thisptr      # hold a C++ instance which we're wrapping
def __cinit__(self):
    self.thisptr = new Foo()

def getMyVector(self):
    cdef vector[int] aa
    cdef int N
    b= []
    aa = self.thisptr.getMyVector()
    N=aa.size()
    for i in range(N):
        b.append(aa[i])
    return b;

但这显然必须存储两个包含相同数据的结构。我想知道是否有办法从 c++ 映射到 cython 列表,或者我应该使用 boost::python 吗?

4

1 回答 1

1

将向量转换为 python 列表是有充分理由的,它在 python 代码中将其用作常规列表。但是,您可以包装向量并添加一个 getter 函数。您确实会节省一些内存,但我认为效率会低得多,因为您每次都必须调用该函数来获取一个值,并且您将无法像在任何 python 表达式中那样使用它蟒蛇名单。

于 2012-10-25T08:43:49.520 回答