web-dev-qa-db-ja.com

python辞書をC ++に翻訳する

次のコードを含む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ライブラリのスパース行列を調べましたが、ゼロ以外の要素のみをループする簡単な方法を見つけることができませんでした。

23
dzhelil

ディクショナリは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';
   }
}
40
Thomas

タイプは

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
}
8
catwalk

Boost.python をご覧ください。これは、pythonとC++の間の相互作用のためです(基本的にはC++を使用してpython libsを構築しますが、C++プログラムにpython)を埋め込むためでもあります)ほとんどのPythonデータ構造とそれに相当するC++が説明されています(必要なものをチェックしていません)。

4
kriss

std::mapまたはより可能性が高いstd::tr1::unordered_map/boost::unordered_map(別名hash_map)はあなたが望むものです。

また、クリスが言ったように、Boost.Pythonはここで見るのが良い考えです。すでにPythonのdictクラスのC++バージョンを提供しているので、言語を超えた作業をしている場合は便利かもしれません。

3
Macke

マップは、ハッシュテーブルではなく、平衡二分木として実装されることがよくあります。これは、Python dictの場合ではありません。したがって、ペアを使用するには、C++ O(1)と同等のデータ構造が必要です。

2
mszlazak

Pythonを介して最適化されたC++ルーチンを呼び出しますか?もしそうなら、読んでください:

Pythonで辞書を扱うときは、よく PyYaml を使用します。おそらく、 LibYAML または yamlcpp のようなもので次のようにリンクできます。

  1. Python辞書をYAML文字列に変換する
  2. Pythonを使用して、 [〜#〜] swig [〜#〜] のようなものを使用してラップされたC++関数を呼び出し、YAML文字列をパラメーターとして使用します。
  3. C++ライブラリを使用してYAMLを解析し、std::mapオブジェクトを取得します
  4. Std :: mapオブジェクトを操作する

警告:私はこれを試したことがありませんが、 "yaml std :: map" でみんなのお気に入りの検索エンジンを使用すると、興味深いリンクがたくさん表示されます

1
Pete

あなたの質問への直接の答えとして(pythonの部分については私の他の答えを見てください)。必要に応じてタプルの部分を忘れることができます。任意のマッピングタイプのキー/値(ハッシュ、など)C++では、一意のキー関数を見つける必要があります。簡単な場合もあります。たとえば、2つの整数が1〜65536の整数である場合、各16ビットがパート1の32ビット整数を使用できます。単純なシフトと、2つの値を組み合わせるための「または」または「+」がトリックを実行し、非常に効率的です。

0
kriss