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.
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';
}
}
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
}
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).
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.
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 à:
- Traduire un dictionnaire Python dans un fichier YAML chaîne
- 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.
- utilisez une bibliothèque C++ pour analyser le YAML & obtenir un
std::map
objet - 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
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.
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.