次のコードを含むpythonコードがあります。
d = {}
d[(0,0)] = 0
d[(1,2)] = 1
d[(2,1)] = 2
d[(2,3)] = 3
d[(3,2)] = 4
for (i,j) in d:
print d[(i,j)], d[(j,i)]
残念ながら、pythonのすべてのキーをループすることは、私の目的には十分な速度ではありません。このコードをC++に変換したいと思います。a=に使用するのに最適なC++データ構造は何ですか。 pythonキーとしてタプルを持つ辞書?上記のコードに相当するC++は何でしょうか?
Boostライブラリのスパース行列を調べましたが、ゼロ以外の要素のみをループする簡単な方法を見つけることができませんでした。
ディクショナリはc ++のstd :: mapになり、2つの要素を持つタプルはstd :: pairになります。
提供されたpythonコードは次のように変換されます:
#include <iostream>
#include <map>
typedef std::map<std::pair<int, int>, int> Dict;
typedef Dict::const_iterator It;
int main()
{
Dict d;
d[std::make_pair(0, 0)] = 0;
d[std::make_pair(1, 2)] = 1;
d[std::make_pair(2, 1)] = 2;
d[std::make_pair(2, 3)] = 3;
d[std::make_pair(3, 2)] = 4;
for (It it(d.begin()); it != d.end(); ++it)
{
int i(it->first.first);
int j(it->first.second);
std::cout <<it->second <<' '
<<d[std::make_pair(j, i)] <<'\n';
}
}
タイプは
std::map< std::pair<int,int>, int>
マップにエントリを追加するコードは次のとおりです。
typedef std::map< std::pair<int,int>, int> container;
container m;
m[ make_pair(1,2) ] = 3; //...
for(container::iterator i = m.begin(); i != m.end(); ++i){
std::cout << i.second << ' ';
// not really sure how to translate [i,j] [j,i] idiom here easily
}
Boost.python をご覧ください。これは、pythonとC++の間の相互作用のためです(基本的にはC++を使用してpython libsを構築しますが、C++プログラムにpython)を埋め込むためでもあります)ほとんどのPythonデータ構造とそれに相当するC++が説明されています(必要なものをチェックしていません)。
std::map
またはより可能性が高いstd::tr1::unordered_map
/boost::unordered_map
(別名hash_map
)はあなたが望むものです。
また、クリスが言ったように、Boost.Pythonはここで見るのが良い考えです。すでにPythonのdictクラスのC++バージョンを提供しているので、言語を超えた作業をしている場合は便利かもしれません。
マップは、ハッシュテーブルではなく、平衡二分木として実装されることがよくあります。これは、Python dictの場合ではありません。したがって、ペアを使用するには、C++ O(1)と同等のデータ構造が必要です。
Pythonを介して最適化されたC++ルーチンを呼び出しますか?もしそうなら、読んでください:
Pythonで辞書を扱うときは、よく PyYaml を使用します。おそらく、 LibYAML または yamlcpp のようなもので次のようにリンクできます。
std::map
オブジェクトを取得します警告:私はこれを試したことがありませんが、 "yaml std :: map" でみんなのお気に入りの検索エンジンを使用すると、興味深いリンクがたくさん表示されます
あなたの質問への直接の答えとして(pythonの部分については私の他の答えを見てください)。必要に応じてタプルの部分を忘れることができます。任意のマッピングタイプのキー/値(ハッシュ、など)C++では、一意のキー関数を見つける必要があります。簡単な場合もあります。たとえば、2つの整数が1〜65536の整数である場合、各16ビットがパート1の32ビット整数を使用できます。単純なシフトと、2つの値を組み合わせるための「または」または「+」がトリックを実行し、非常に効率的です。