7
votes

C + 11 Conteneur associatif qui garde l'ordre d'insertion?

est là, dans la "bibliothèque standard" C ++, toute structure de conteneurs "associative" (i.e ""), qui a la capacité de conserver la commande, par ordre d'insertion?

J'ai vu plusieurs sujets à ce sujet, cependant, il semble que le plus avant C ++ 11.

Certains suggèrent d'utiliser "Boost :: Multi_index", mais, le cas échéant, je voudrais "préférer" utiliser des conteneurs / structures standard.

Je vois que C ++ 11 présente plusieurs conteneurs associatifs "non ordonnés": .

sont l'une de ces caractéristiques, d'une certaine manière, "configurable", de telle sorte qu'elles ne soient triées que par ordre d'insertion?

Merci!

c


6 commentaires

Il suffit d'utiliser un non-ordonné_map et un vecteur ensemble


Vous recherchez std :: vecteur > ?


Donc, vous voulez l'équivalent de Java LinkedHashmap ?


@aaronman qui ne fonctionne que si vous ne modifiez pas la carte avec des fonctions qui attendent une interface de carte normale. De plus, les déménagements au milieu seront alors beaucoup plus lents et devaient changer de vecteur. Si cela n'est pas une préoccupation, alors sûr.


J'utilise boost :: multididex pour cela et ça fonctionne bien. Bien que dans certains cas, je voudrais ne pas avoir la dépendance supplémentaire.


@hyde rien ne vous empêche d'utiliser un autre conteneur à la place de :: std :: vecteur , tel que :: std :: liste ou implémentez votre propre conteneur associé avec les caractéristiques souhaitées.


3 Réponses :


2
votes

Non.

Vous mélangez un accès linéaire avec aléatoire. Pas très bon lit de lit.

Il suffit d'utiliser à la fois un vecteur / Liste (c.-à-d. ordre d'insertion) avec une carte à l'aide d'un index dans l'ancien.


3 commentaires

Ils sont très bons de luxe, très agréable d'avoir quand, besoin de cela et d'avoir un tel conteneur est également une mise en œuvre triviale. Si C ++ n'en a pas un, je suis un peu surpris. Exemple: docs.oracle.com/javase/7/ Docs / API / Java / Util / LinkedHashMap.ht ml


@hyde - il s'agit simplement de lier deux structures de données ensemble. Deux - pas un.


Hashmap est déjà une combinaison de plusieurs structures de données en interne, donc je ne vois donc pas quelle différence qui fait ... L'insertion ordonnée Hashmap nécessite toujours un peu de code, doit être enveloppée à l'intérieur d'une classe et doit bien sûr fournir exactement la même interface que Hashmap non ordonné normal. Notez que la conservation de l'ordre d'insertion n'affecte pas l'efficacité algorithmique, contrairement à la conservation de la commande de triée.



0
votes

non; Cette capacité a apparemment été sacrifiée au nom de la performance.

L'ordre d'éléments équivalents doit être préservé à travers les opérations, y compris REVASHES, mais il n'y a aucun moyen de spécifier l'ordre d'origine. Vous pouvez, en théorie, utiliser std :: rotation ou similaire pour perperguer les objets dans la commande souhaitée après chaque insertion. Évidemment peu pratique, mais cela prouve que le manque de capacité est un peu arbitraire.

Votre meilleur pari est de conserver les sous-séquences dans les conteneurs internes. Vous pouvez utiliser un adaptateur d'itérateur pour itérus sur un conteneur aussi "profond" comme s'il s'agissait d'une séquence unique. Un tel utilité peut probablement être trouvé dans Boost.


0 commentaires

0
votes

Non. Dans des cartes non ordonnées aussi, il n'est pas stocké selon l'ordre d'insertion.

Vous pouvez utiliser vecteur pour garder la piste de la touche !


0 commentaires