5

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

4

2 回答 2

1

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

于 2012-11-14T14:18:23.753 回答
0

不幸的是,indexing_suiteBoost.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中。

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

于 2011-02-10T15:45:57.837 回答