26

次のコードを含む 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++ に変換したいと考えています。キーとしてタプルを持つ Python 辞書に使用するのに最適な C++ データ構造は何ですか? 上記のコードに相当する C++ は何でしょうか?

ブースト ライブラリでスパース行列を調べましたが、ゼロ以外の要素だけをループする簡単な方法が見つかりませんでした。

4

7 に答える 7

41

ディクショナリは 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';
   }
}
于 2009-12-03T21:17:00.313 に答える
8

タイプは

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
}
于 2009-12-03T21:12:20.080 に答える
5

Boost.pythonを見てください。これは、python と C++ の間の対話用です (基本的には、C++ を使用して python ライブラリを構築しますが、C++ プログラムに python を埋め込むためのものです)。ほとんどの pythons データ構造とそれに相当する C++ が記述されています (必要なものはチェックされていません)。

于 2009-12-03T21:22:25.320 に答える
3

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

また、kriss が言ったように、Boost.Python はこちらを参照することをお勧めします。Python の dict クラスの C++ バージョンが既に提供されているので、クロスランゲージの作業をしている場合は便利かもしれません。

于 2009-12-03T21:26:46.967 に答える
2

Map は、多くの場合、ハッシュ テーブルではなくバランスの取れたバイナリ ツリーとして実装されます。これは、Python dict には当てはまりません。したがって、ペアを使用するには、C++ O(1) と同等のデータ構造が必要です。

于 2016-05-20T20:24:57.183 に答える
1

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

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

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

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

于 2009-12-03T22:10:06.010 に答える
0

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

于 2009-12-03T21:37:56.150 に答える