Python — Отображение Cython c ++ структуры данных

Я использую 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::map как питон dict и std :: vector как python list без явного создания (и, следовательно, траты памяти) копий таких структур.

Временная реализация для 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?

0

Решение

Есть очень веская причина для преобразования вектора в список Python, который использует его как обычный список в коде Python. Тем не менее, вы можете обернуть вектор и добавить функцию получения. Вы действительно сэкономите немного памяти, но я думаю, что это будет гораздо менее эффективно, так как вам придется каждый раз вызывать функцию, чтобы получить значение, и вы не сможете использовать ее в выражениях Python, как если бы список питонов.

1

Другие решения

Других решений пока нет …