Juste pour détailler un peu ce qui a déjà été dit.
Classé Conteneurs
Le immuabilité est extrêmement important ici: std::map
et std::set
sont généralement mis en œuvre en termes d'arbres binaires (arbres rouge-noir pour mes quelques versions du STL) en raison des exigences relatives à l'insertion, opération d'extraction et de suppression (et notamment en raison de l'invalidation des exigences de l'itérateur). Cependant, en raison de l'immutabilité, comme vous le soupçonniez, il y a d'autres candidats, pas les moindres d'entre eux étant des récipients semblables à des matrices.Ils ont ici quelques avantages:
- minimum de frais généraux (en terme de mémoire)
- contiguïté de la mémoire, et donc localité cache
Plusieurs "Random Access conteneurs" sont disponibles ici:
Boost.Array
std::vector
std::deque
La seule chose que vous devez vraiment faire peut être rompu fait en 2 étapes:
- pousser toutes vos valeurs dans le récipient de votre choix, puis (après tout ont été insérées) utilisez
std::sort
dessus.
- recherche de la valeur à l'aide
std::binary_search
, qui a O (log (n)) complexité
En raison de la localité de cache, la recherche sera en fait plus rapide, même si le comportement asymptotique est similaire.
Si vous ne voulez pas réinventer la roue, vous pouvez également consulter les [AssocVector][1]
d'Alexandrescu. Alexandrescu essentiellement porté les std::set
et std::map
interfaces sur une std::vector
:
- parce qu'il est plus rapide pour les petits ensembles de données
- car il peut être plus rapide pour les jeux de données congelés
Unsorted conteneurs
En fait, , si vous ne vous souciez vraiment pas de votre commande et que votre collection est assez grande, alors un unordered_set
sera plus rapide, surtout parce que les nombres entiers sont si triviaux à hash size_t hash_method(int i) { return i; }
. Cela pourrait très bien fonctionner ... à moins que vous ne soyez confronté à une collection qui provoque de nombreuses collisions, car alors les conteneurs non triés vont chercher dans la liste des "collisions" d'un hachage donné en temps linéaire.
Conclusion
Juste essayer l'approche std::vector
et triés l'approche boost::unordered_set
avec un ensemble de données « réel » (et toutes les optimisations sur) et prenez celui que vous donne le meilleur résultat.
Malheureusement nous ne pouvons pas vraiment aider plus là, parce que cela dépend fortement de la taille de l'ensemble de données et la répartition de ses éléments
On dirait que vous voulez un arbre de recherche binaire? – StrixVaria
L'ensemble C++ utilise la commande, sous la forme d'opérateur <(), pour les éléments stockés dans l'ensemble. Pourquoi ne pas l'utiliser? –
@Neil: Si les données sont déjà commandées, il est plus rapide de les placer dans un conteneur à accès aléatoire (si ce n'est déjà fait) et de faire une recherche binaire. –