使用 Boost Python 创建和访问frozenset

Posted

技术标签:

【中文标题】使用 Boost Python 创建和访问frozenset【英文标题】:Create and access frozenset with Boost Python 【发布时间】:2011-02-09 15:21:49 【问题描述】:

我有一些以std::set<std::string> 作为参数或返回值的 C++ 方法。 我想将此映射到 Python frozenset(或常规 set),但似乎没有一种直接的方法可以做到这一点。 有谁知道如何完成这项任务。

【问题讨论】:

【参考方案1】:

或者您可以使用std::map<YourType, int> 代替std::set<YourType>,例如,该值可以是0。std::map 与std::set 具有相同的插入/搜索时间复杂度,它还保持键的顺序,它只会使内存膨胀一点。然后你可以使用地图索引套件,如果需要的话,你可以在 python 中隐藏一些包装类中的差异。缺点是您必须稍微修改现有的 c++ 代码。

【讨论】:

【参考方案2】:

不幸的是,来自 Boost.Python 的标准 indexing_suite 不支持 std::set。有一个 indexing_suite v2,适用于所有 stl 容器。 (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014704.html)

它可能没有进入官方发行版,但你可以通过四处询问找到它。 (http://mail.python.org/pipermail/cplusplus-sig/2009-July/014691.html)

我发现它比原来的 indexing_suite 更难使用,但它可能符合您的需求。

如果这不起作用,您可以像处理任何其他类一样手动包装std::set<std::string>。这将使您将std::set<std::string> 转换为python,您可以很容易地将其转换为python set


我认为这两者都需要更多的工作。这是我会做的:

首先,在 C++ 中使用具有相同签名的函数包装函数,但将返回的数据填充到 std::vector<std::string> 而不是 std::set<std::string>。公开那个函数而不是原来的

现在你有了python中的数据。

其次,将 c++ 函数包装在 python 函数中,该函数将 std::vector<std::string> 中的数据填充到 python set 中。

是的,从设计美学的角度来看,这是相当愚蠢的,而且不是世界上性能最高的代码,但它可以让你用最少的代码到达你要去的地方,而且它相当健壮。

【讨论】:

第二个选项是我目前所做的,但它不是很干净整洁......我可以试试索引套件版本 2。

以上是关于使用 Boost Python 创建和访问frozenset的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::python 从 c++ 函数访问大表

Boost::python 和 Eigen/dense 创建分段错误

使用 boost::python::make_function 设置 __name__ 属性

修改 Boost Python 包装类?

多线程应用程序上的 boost::asio::ssl 访问冲突

Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)