Traduire le dictionnaire python en C++

j'ai du code python qui contient le code suivant.

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)]

malheureusement, boucler toutes les touches en python n'est pas assez rapide pour mon usage, et je voudrais traduire ce code en C++. Quelle est la meilleure structure de données C++ à utiliser pour un dictionnaire python dont les clés sont tuples? Quel serait l'équivalent C++ du code ci-dessus?

j'ai regardé des matrices éparses dans la bibliothèque de boost, mais n'ai pas pu trouver un moyen facile de boucler seulement sur le non-zéro éléments.

22
demandé sur dzhelil 2009-12-04 00:10:19

7 réponses

un dictionnaire serait une carte std::en c++, et un tuple avec deux éléments serait une paire std::.

le code python fourni se traduirait par:

#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';
   }
}
39
répondu Thomas 2009-12-03 22:30:30

le type est

std::map< std::pair<int,int>, int>

le code pour ajouter des entrées à la carte est comme ici:

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
répondu catwalk 2009-12-03 22:00:09

regardez coup de pouce.python. C'est pour l'interaction entre python et C++ (essentiellement construire des libs python en utilisant C++, mais aussi pour intégrer python dans les programmes C++). La plupart des structures de données pythons et leurs équivalents C++ sont décrits (n'ont pas été vérifiés pour celui que vous voulez).

4
répondu kriss 2009-12-03 21:22:25

std::map ou, plus probablement,std::tr1::unordered_map/boost::unordered_map (aka hash_map) est-ce que vous voulez.

aussi, comme l'a dit kriss, Boost.Python est une bonne idée de regarder ici. Il fournit déjà une version C++ de la classe dict de python, donc si vous faites des choses en plusieurs langues, cela pourrait être utile.

3
répondu Macke 2009-12-03 21:26:46

voulez-vous appeler une routine c++ optimisée via Python? Si oui, lisez ce qui suit:

souvent j'utilise PyYaml en traitant avec des dictionnaires en Python. Peut-être pourriez-vous lier dans quelque chose comme LibYAML ou yamlcpp à:

  1. Traduire un dictionnaire Python dans un fichier YAML chaîne
  2. utilisez Python pour appeler une fonction C++ enveloppée en utilisant quelque chose comme SWIG, en prenant la chaîne YAML comme une paramètre.
  3. utilisez une bibliothèque C++ pour analyser le YAML & obtenir un std::map objet
  4. Fonctionner sur std::map l'objet

attention: je n'ai jamais essayé cela, mais en utilisant le moteur de recherche préféré de chacun sur "yaml std:: map" les rendements beaucoup de liens intéressants

1
répondu Pete 2009-12-03 22:15:07

Map est souvent implémenté comme un arbre binaire équilibré et non comme une table de hachage. Ce n'est pas le cas pour un python dict. Vous avez donc besoin d'une structure de données équivalente C++ O(1) pour utiliser vos paires.

1
répondu mszlazak 2016-05-20 20:24:57

comme réponse directe à votre question (pour la partie python, regardez mon autre réponse). Tu peux oublier la partie tuple si tu veux. Vous pouvez utiliser n'importe quelle clé de type de mapping/valeur (hachage, etc.) en C++, il suffit de trouver une fonction clé unique. Dans certains cas, cela peut être facile. Par exemple si vous deux entiers sont des entiers entre 1 et 65536 vous pouvez juste utiliser un entier de 32 bits avec chaque partie de 16 bits une des clés. Une simple maj et un " ou " ou + de combiner les deux valeurs ferait l'affaire et elle est très efficace.

0
répondu kriss 2009-12-03 21:37:56