调用C ++函数,该函数使用boost :: python将指针指向数组

时间:2013-04-02 19:55:45

标签: c++ python pointers boost-python

我想调用一个C ++函数,它使用boost :: python在Python列表中获取指向数组的指针。我有这样的解决方案:

//A function that takes a pointer to an array
void doSomething( int const n, double * a)
{
    for ( std::size_t i=0; i<n; ++i)
        a[i] += 1.;
}  

//My solution 
std::vector<double> add1 (std::vector<double> vec)
{
    doSomething(vec.size(),vec.data());
    return vec;
}

//boost::python registration 
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(vector2)
{
    using namespace boost::python;
    def("doSomething", doSomething);
    def("add1", &add1);

    class_<std::vector<double> >("VectorOfDouble")
        .def(vector_indexing_suite<std::vector<double> >());
}

哪个适用于Python:

>>> import vector2
>>> lint=[1,2,3,4]
>>> old_vector = vector2.VectorOfDouble()
>>> old_vector.extend(arg for arg in lint)
>>> new_vector=vector2.add1(old_vector)
>>> print list(old_vector)
[1.0, 2.0, 3.0, 4.0]
>>> print list(new_vector)
[2.0, 3.0, 4.0, 5.0]

但是,这需要将原始列表复制到新列表中。由于我正在使用的阵列非常大,我宁愿避免这种情况。像这样修改我的解决方案不会返回任何错误,但原始对象不会被修改:

//My solution 
void add1 (std::vector<double> vec)
{
    doSomething(vec.size(),vec.data());
}

python中:

>>> import vector2
>>> lint=[1,2,3,4]
>>> old_vector = vector2.VectorOfDouble()
>>> old_vector.extend(arg for arg in lint)
>>> print list(old_vector)
[1.0, 2.0, 3.0, 4.0]
>>> vector2.add1(old_vector) 
>>> print list(old_vector)
[1.0, 2.0, 3.0, 4.0]

有没有办法调用doSomething并修改原始矢量而不创建新的矢量?

顺便说一下,根据另一篇文章的建议,我还尝试编写一个简单的包装器来获取指向vector的第一个元素的指针:

std::string * pointer (std::string& p)
{
    return &p;
}

但似乎返回指针的任何函数的Boost注册在编译时会产生非常长的错误。

1 个答案:

答案 0 :(得分:2)

请注意,您将std :: vector作为副本。

您是否尝试过将其作为参考,并了解结果会是什么?

// take by reference
void add1 (std::vector<double>& vec)
{
    doSomething(vec.size(),vec.data());
}