2017-02-06 1 views
2

J'ai un programme Java que je veux convertir en C++. Donc, il y a une structure de données Linkedhashmap utilisée dans le code Java et je veux le convertir en C++. Existe-t-il un type de données équivalent pour LinkedHashmap en C++?LinkedHashmap équivalent en C++?

J'ai essayé d'utiliser std::unordered_map, cependant, il ne maintient pas l'ordre de l'insertion.

+0

Non, vous ne l'avez pas. c'est une structure de données moche pour commencer, pas étonnant que personne n'a jamais suggéré de l'uniformiser –

+0

@DavidHaim hmmm. Alors, comment puis-je créer un hashmap avec un ordre d'itération prévisible? – emadalamoudi

+2

Vous devez vous demander pourquoi l'ordre d'insertion dans un hashmap aurait été important. –

Répondre

6

C++ n'offre pas de modèle de collection avec le comportement qui imiterait LinkedHashMap<K,V> de Java, vous devrez donc gérer l'ordre séparément du mappage.

Ceci peut être réalisé en maintenant les données dans un std::list<std::pair<K,V>>, et de garder une carte std::unordered_map<k,std::list::iterator<std::pair<K,V>>> séparée pour consultation rapide de l'élément par clé:

  • En ajoutant un élément, ajoutez la clé correspondante/valeur Associer à la fin de la liste et mapper la clé à l'itérateur std::prev(list.end()).
  • Lors de la suppression d'un élément par clé, recherchez son itérateur, supprimez-le de la liste, puis supprimez le mappage.
  • Lors du remplacement d'un élément, recherchez d'abord l'itérateur de liste à partir de la carte non ordonnée, puis remplacez son contenu par une nouvelle paire valeur/clé.
  • Lors de l'itération des valeurs, il suffit de répéter std::list<std::pair<K,V>>.
+0

Merci, je pense que c'est ce que je dois faire. Cela ajoutera plus de complexité, mais au moins cela va maintenir l'ordre. Merci encore – emadalamoudi

+0

Puisqu'il s'agit de la réponse acceptée, je trouve encore nécessaire de souligner que c'est pire qu'un LinkedHashMap: 1) indirection supplémentaire lors de la recherche par clé 2) Hash-lookup requis pour erase-by-iterator. Une solution intégrée dans laquelle l'entrée contient des pointeurs pour deux listes liées (ordre d'insertion et ensemble de hachage) ne présente aucun de ces inconvénients. Est-ce que ça importe? Difficile à dire/dépend. La solution proposée * est-elle strictement inférieure à une telle LinkedHashMap? Oui. – misberner