2017-07-06 4 views
0

J'essaie de porter un programme de Java vers C++ et je n'arrive pas à comprendre comment convertir un LinkedHashMap en un std :: map. Je ne peux pas changer le LinkedHashMap mais je ne suis pas limité à std :: map. J'en ai besoin pour produire la même paire clé/valeur mais commander/hacher/quoi que ce soit d'autre n'a pas vraiment d'importance.Conversion de Java LinkedHashMap en C++ std :: map

code Java à convertir:

List<Face> faces = new ArrayList<Face>(modelFull.faces.length); 
Map<Point3D, Integer> map = new LinkedHashMap<Point3D, Integer>(); 
for (int i = 0; i < modelFull.faces.length; i++) { 
    Face f = new Face(modelFull.faces[i]); 
    faces.add(f); 
    for (int k = 0; k < 3; k++) { 
     Point3D p = f.pts[k]; 
     Integer v = map.get(p); 
     if (v == null) { 
      v = 0; 
     } 
     map.put(p, v + 1); 
    } 
} 

Ma tentative:

std::map<RVPoint3D, int> pointMap; 
auto modelFaces = modelFull.getFaces(); 
for (const auto &face : modelFaces) 
{ 
    Face newFace = Face(face); 
    for (int k = 0; k < 3; ++k) 
    { 
     RVPoint3D pt = newFace.getPts()[k]; 
     ++pointMap[pt]; 
    } 
    faces.push_back(newFace); 
} 

L'implémentation Java crée une carte de taille 7523 et un C++ est 7967. Il y a 45234 éléments inspectés au total pour à la fois il semble donc itérer correctement à travers les clés potentielles.

Je ne sais pas où aller à partir d'ici. J'ai essayé de surcharger les opérateurs, les comparateurs personnalisés, les fonctions de hachage personnalisées, etc. et il me manque quelque chose.

+3

Bienvenue dans Stack Overflow! Il semble que vous ayez besoin d'apprendre à utiliser un débogueur. S'il vous plaît aidez-vous à quelques [techniques de débogage complémentaires] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Si vous avez encore des problèmes après, s'il vous plaît n'hésitez pas à revenir avec un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) qui démontre votre problème. –

+0

Veuillez publier des solutions en tant que réponses et non en tant que mises à jour de la question.Ceci est pour aider à éviter la confusion. Je vous remercie. – Bugs

Répondre

0

Le passage à une carte non ordonnée, en utilisant aa fonction de hachage personnalisé et de surcharger l'opérateur == a fait l'affaire

auto hashCode = [](const RVPoint3D pt) 
{ 
    return pt.x + pt.y + pt.z; 
}; 

std::unordered_map<RVPoint3D, int, std::function<double(RVPoint3D)>> pointMap{modelFull.getFaces().size(), hashCode}; 

Je pense que ma première tentative à c'était incorrect d'une certaine manière, mais cela fonctionne parfaitement alors peut-être » ll aidera quelqu'un d'autre à l'avenir.

0

Dans la version java pour les nouveaux éléments de la carte que vous définissez v-0 puis ajoutez 1 à quand vous le mettez dans la carte. \ dans la version C++ vous l'avez mis en seulement 0.

Java

Integer v = map.get(p); 
if (v == null) { 
    v = 0; 
} 
map.put(p, v + 1); // new map entries go in as 1 

C++

if (pointMap.count(pt)) 
{ 
    pointMap[pt] += 1; 
} else { 
    pointMap[pt] = 0; // new map entries go in as 0 
} 

peut également vous fixer un nullIteger-0 en Java? Ne vous devez faire quelque chose comme:

v = new Integer(0); // ? 

Side Note:

Le code C++ peut être réécrite comme:

for (const auto &face : modelFaces) 
{ 
    Face newFace(face); // Value, no need for Java-like syntax 
    for (int k = 0; k < 3; ++k) 
    { 
     RVPoint3D pt = newFace.getPts()[k]; 
     ++pointMap[pt]; // auto sets to 1 on new entry 
    } 
    faces.push_back(newFace); 
} 

Cela fonctionne parce que si une clé n'existe pas dans un std::map un est créé automatiquement (avec la valeur correspondante 0) lorsque vous y accédez en utilisant pointMap[pt]. Donc, vous pouvez simplement incrémenter et les nouvelles valeurs vont commencer à 1 tout comme dans le code Java.

+0

Bonne prise sur la boucle C++. Au départ, j'avais quelque chose de similaire mais j'ai oublié de le changer. Malheureusement, cela a peut-être corrigé un problème avec les valeurs, mais il ne corrige toujours pas les éléments supplémentaires dans la carte. Le code Java semble fonctionner correctement, donc je ne suis pas sûr de mettre l'entier à null. Je n'ai aucun contrôle sur ce code et aucune documentation. – rghamilton3

+0

@ rghamilton3 Ensuite, je suppose que votre problème est ailleurs. Peut-être la source de vos valeurs? Nourrissez-vous vos cartes exactement la même chose? Il peut être utile de comparer * ce * code pour voir que vous faites quelque chose de différent entre 'Java' et' C++ '. – Galik

+0

@ rghamilton3 Est-ce que votre entier ou virgule flottante est votre point3D? – Galik