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

Posted

技术标签:

【中文标题】std::vector 到 boost::python::list 而不复制数据【英文标题】:std::vector to boost::python::list without copy the data 【发布时间】:2018-05-18 05:15:29 【问题描述】:

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

天真地,我可以构建一个新的 C++ 类,其中包含一个指针并转发所有必需的属性,然后将这个新类公开给 python。是否有更好(更简单或系统)的方法来获取 python '列表'(不是真正的列表,因为不允许设置器)而不复制基础数据?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于std::vector 到 boost::python::list 而不复制数据的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 std::vector 传递到 std::valarray 的最有效方法

std::vector<std::string> 到 char* 数组

将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]

运行时错误:引用绑定到“std::vector<int, std::allocator<int>>”类型的空指针 (stl_vector.h)

运行时错误:引用绑定到“std::vector<int, std::allocator<int> >”类型的空指针 (stl_vector.h)

将 std::vector 复制到 qvector