0

C++ クラスをラップするために 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.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 を 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;

しかし、これは明らかに同じデータを含む 2 つの構造体を格納する必要があります。c++ から cython を使用してリストにマップする方法があるかどうか、または boost::python を使用する必要があるかどうか疑問に思っています。

4

1 に答える 1

1

ベクトルを Python リストに変換するのには十分な理由があります。これは、Python コードで通常のリストとして使用されます。ただし、ベクターをラップして getter 関数を追加することはできます。確かにいくらかのメモリを節約できますが、値を取得するたびに関数を呼び出す必要があり、Python 式でそれを使用することができないため、効率が大幅に低下すると思います。パイソンリスト.

于 2012-10-25T08:43:49.520 に答える