std :: vector来boost :: python :: list而不复制数据

时间:2018-05-18 05:15:30

标签: python c++ boost-python

我的问题与std::vector to boost::python::list基本相同。不同之处在于我只需要在python端从C ++读取读取数据。

天真地,我可以构建一个新的C ++类,它包含一个指针并转发所有必需的属性,然后将这个新类暴露给python。是否有一种更好(更简单或更系统)的方式来获得一个python' list' (不是真的是一个列表,因为不允许setter)而不复制底层数据?

1 个答案:

答案 0 :(得分:1)

如果您不想转换std::vector to boost::python::list。然后,如果将向量的大小传递给python端并使用参数作为索引迭代函数以将向量元素获取到python侧,则可以实现。

在cpp:

class vc
{
    private:
        vector <int> vec ;
    public: 
        vc(){};
        void set_vector();
        int vector_size();
        int vector_iterator(int index);
        ~vc(){};
}

void vc::set_vector()
{
    for(int i=0;i<10;i++)
        this->vec.push_back(i);
}

int vc::vector_size()
{   
    return this->vec.size();
}

int vc::vector_iterator(int index)
{   
    if(this->vec.size()> index)
        return  this->vec[index];
    return 0;
}

BOOST_PYTHON_MODULE(vector_imp)  
{  
    class_<vc>("vc", init<>())
        .def("set_vector",&vc::set_vector)
        .def("vector_size",&vc::vector_size)  
        .def("vector_iterator",&vc::vector_iterator)
    ;  
}

在python中:

import vector_imp as vect
    vc_obj = vect.vc()
    vc_obj.set_vector()
    v_size = vc_obj.vector_size()
    for i in range(0,v_size):
        element = vc_obj.vector_iterator(i)
        print element