std::set<std::string>
引数または戻り値を持つ C++ メソッドがいくつかあります。frozenset
これを Python (または通常の )にマップしたいのset
ですが、これを行う簡単な方法はないようです。このタスクを達成する方法を知っている人はいますか。
2 に答える
または、std::map<YourType, int>
代わりに を使用できstd::set<YourType>
ます。値は、たとえば 0 にすることができます。std::map は、std::set と同じ挿入/検索時間の複雑さを持ち、キーの順序も保持します。メモリが少し膨張するだけです。次に、マップ インデックス スイートを使用できます。Python では、必要に応じて一部のラッパー クラスの違いを隠すことができます。欠点は、既存の C++ コードを少し変更する必要があることです。
残念ながら、indexing_suite
Boost.Python の標準は をサポートしていませんstd::set
。すべての stl コンテナで動作する indexing_suite v2 があります。(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に変えることができます。set
どちらも必要以上の仕事だと思います。これが私がすることです:
最初に、C++ の関数を同じシグネチャを持つ関数でラップしますが、返されたデータをstd::vector<std::string>
ではなく に詰め込みstd::set<std::string>
ます。元の機能ではなくその機能を公開する
これで、Python にデータができました。
std::vector<std::string>
次に、データを取得して python に詰め込むpython 関数で c++ 関数をラップしますset
。
はい、これはデザインの美学の観点からはかなりばかげており、世界で最もパフォーマンスの高いコードではありませんが、最小限のコードで目的の場所に到達でき、かなり堅牢です。