当前位置: 首页 > 面试题库 >

boost :: python:Python列表到std :: vector

燕鸿文
2023-03-14
问题内容

最后,我可以使用[]运算符在python中使用std :: vector。诀窍是在boost C ++包装器中简单提供一个容器来处理内部向量:

#include <boost/python.hpp>
#include <vector>
class world
{
    std::vector<double> myvec;

    void add(double n)
    {
        this->myvec.push_back(n);
    }

    std::vector<double> show()
    {
     return this->myvec;
    }
};

BOOST_PYTHON_MODULE(hello)
{
    class_<std::vector<double> >("double_vector")
        .def(vector_indexing_suite<std::vector<double> >())
    ;

    class_<World>("World")
     .def("show", &World::show)
        .def("add", &World::add)
    ;
 }

另一个挑战是:如何将python列表转换为std :: vectors?我试图添加一个期望将std :: vector作为参数的c
++类,并添加了相应的包装器代码:

#include <boost/python.hpp>
#include <vector>
class world
{
    std::vector<double> myvec;

    void add(double n)
    {
        this->myvec.push_back(n);
    }

    void massadd(std::vector<double> ns)
    {
        // Append ns to this->myvec
    }

    std::vector<double> show()
    {
     return this->myvec;
    }
};

BOOST_PYTHON_MODULE(hello)
{
    class_<std::vector<double> >("double_vector")
        .def(vector_indexing_suite<std::vector<double> >())
    ;

    class_<World>("World")
     .def("show", &World::show)
        .def("add", &World::add)
        .def("massadd", &World::massadd)
    ;
 }

但是,如果这样做,我将得到以下Boost.Python.ArgumentError:

>>> w.massadd([2.0,3.0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    World.massadd(World, list)
did not match C++ signature:
    massadd(World {lvalue}, std::vector<double, std::allocator<double> >)

谁能告诉我如何在c ++函数中访问python列表?

谢谢,丹尼尔


问题答案:

为了使您的C ++方法接受Python列表,您应该使用 boost::python::list

void massadd(boost::python::list& ns)
{
    for (int i = 0; i < len(ns); ++i)
    {
        add(boost::python::extract<double>(ns[i]));
    }
}


 类似资料:
  • 推进序列化 树类 作家 读者 我已经写入并验证了对文件的成功序列化,但未能从可用对象中反序列化。 无论我是用文本还是二进制编写,我都可以验证序列化的输出是否正确,但由于某些原因,序列化的输出不会反序列化,并且在加载时留下一个空对象。

  • 我的DTO中有一个字符串列表,我想把它映射成一个对象列表,在映射器中我使用服务通过这个字符串获取对象,但我有以下错误 考虑声明/实现一个映射方法:“java.util.list map(java.util.list value)”。

  • 我使用的是mapstruct 1.4.2.final。我有一个这样的问题: Business1 id有许多Business2 id关系。我想像RelationDTO一样使用DTO来记录。 谢谢你的留言。

  • 根据http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/cpp2011/futures.html,我们可以将boost::asio与一起使用。但是我找不到任何有关使用的信息,它具有更多的功能,例如。我怎么用?

  • 问题内容: 如果我在很长的列表上继续调用len(),那是我在浪费时间,还是在后台保持int计数? 问题答案: 不用担心:当然,它可以节省计数,因此在列表中是一项非常便宜的操作。顺便说一句,字符串,字典和集合也是如此!

  • Boost 库是一个经过千锤百炼、可移植、提供源代码的 C++ 库,作为标准库的后备,是 C++ 标准化进程的发动机之一。 Boost 库由 C++ 标准委员会库工作组成员发起,在 C++ 社区中影响甚大,其成员已近 2000 人。 Boost 库为我们带来了最新、最酷、最实用的技术,是不折不扣的“准”标准库。