Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cython映射c++;数据结构 我使用Cython来包装我的C++类:_C++_Python_Wrapper_Cython - Fatal编程技术网

Cython映射c++;数据结构 我使用Cython来包装我的C++类:

Cython映射c++;数据结构 我使用Cython来包装我的C++类:,c++,python,wrapper,cython,C++,Python,Wrapper,Cython,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.pu

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;
    }
}

但这显然必须存储包含相同数据的两个结构。我想知道有没有办法用Cython从C++映射到列表,或者我应该使用Booo::Python?

< P>,这是一个非常好的理由,将向量转换为Python列表,它将它作为Python代码中的常规列表。但是,您可以包装向量并添加getter函数。您确实可以节省一些内存,但我认为这会大大降低效率,因为您每次都必须调用该函数来获取值,并且无法像在python列表中那样在任何python表达式中使用它。

好的,我面临的唯一问题是处理向量的自定义类型。在本例中,我们使用
vector
,但cython编译器无法处理,例如
vector
,其中
Foo
是我的一个类。事实上,对于您所要求的,python list和dict应该最适合。至于Foo*——您可以通过使用uintptr_t type而不是Foo*来解决这个问题,并在cdef方法中转换回Foo*。
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;