我有一些 C++ 方法std::set<std::string>
作为参数或返回值。我想将其映射到 Python frozenset
(或常规set
),但似乎没有一种直接的方法可以做到这一点。有谁知道如何完成这项任务。
2 回答
或者你可以使用std::map<YourType, int>
代替 ,std::set<YourType>
例如,该值可以是 0。std::map 具有与 std::set 相同的插入/搜索时间复杂度,它还保持键的顺序,它只会使内存膨胀一点。然后你可以使用地图索引套件,如果需要的话,你可以在 python 中隐藏一些包装类中的差异。缺点是您必须稍微修改现有的 c++ 代码。
不幸的是,indexing_suite
Boost.Python 的标准不支持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>
像任何其他类一样手动包装。这会让你进入 python,在那里你可以很容易地std::set<std::string>
将它变成 python 。set
我认为这两者都需要更多的工作。这是我要做的:
首先,在 C++ 中使用具有相同签名的函数包装函数,但将返回的数据填充到 astd::vector<std::string>
而不是 a 中std::set<std::string>
。公开该功能而不是原始功能
现在你有了python中的数据。
其次,将 c++ 函数包装在 python 函数中,该函数将其中的数据std::vector<std::string>
填充到 pythonset
中。
是的,从设计美学的角度来看,这是相当愚蠢的,而且不是世界上性能最高的代码,但它可以让你用最少的代码到达你要去的地方,而且它相当健壮。