Я использую 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?
Есть очень веская причина для преобразования вектора в список Python, который использует его как обычный список в коде Python. Тем не менее, вы можете обернуть вектор и добавить функцию получения. Вы действительно сэкономите немного памяти, но я думаю, что это будет гораздо менее эффективно, так как вам придется каждый раз вызывать функцию, чтобы получить значение, и вы не сможете использовать ее в выражениях Python, как если бы список питонов.
Других решений пока нет …