Est-il un sorted_vector classe, qui prend en charge insert (), etc.?
Souvent, il est plus efficace d'utiliser une triés std::vector
au lieu d'un std::set
. Personne ne sait d'une bibliothèque de classe sorted_vector
, qui, fondamentalement, a une interface similaire à std::set
, mais insère des éléments dans le vecteur trié (de sorte qu'il n'y a pas de doublons), utilise les binaires de recherche à find
éléments, etc.?
Je sais c'est pas dur à écrire, mais probablement mieux de ne pas perdre de temps, et d'utiliser une implémentation existante de toute façon.
Mise à jour: La raison de l'utilisation d'un vecteur trié au lieu d'un jeu est la suivante: Si vous avez des centaines de milliers de petits ensembles qui contiennent seulement 10 ou si des membres de chacun, il est plus efficace de la mémoire de l'utiliser juste trié les vecteurs de la place.
- Pourriez-vous être plus précis sur ce en std::set n'est pas assez efficace?
- Si vous avez des centaines de milliers de petits ensembles qui contiennent seulement 10 ou si des membres de chacun, il est plus efficace de la mémoire de l'utiliser juste trié les vecteurs de la place.
- Je ne pense pas qu'il y a un ready-made de classe pour que. Vous pouvez écrire votre propre ou de l'utilisation
lower_bound()
pour l'insertion et labinary_search()
pour la recherche. - Si les vecteurs sont de petite taille, la différence entre le binaire et de la recherche séquentielle est susceptible d'être trop petite, de sorte que vous pouvez simplement utiliser un std::vector.
- La différence va probablement être très importantes à cause de la cache que le jeu va subir.
- Je suis en train d'écrire ce conteneur. J'en aurais fait en une semaine (avec StackOverflow de l'aide! 🙂 Où est le meilleur endroit pour partager ce code?
- G: Peut-être télécharger sur google code ou à github et poster le lien ici?
- C'est par ici: stackoverflow.com/questions/3125905/... . S'il vous plaît laissez-moi savoir si vous faites des améliorations.
- Je suis un peu en retard à cette question, mais de toute façon 🙂 Vous devriez vérifier si le binaire de recherche triés vecteur de "10" éléments est plus vite que juste une recherche linéaire. Il est tout à fait possible qu'il n'est pas plus rapide, ou il pourrait même être plus lent que le processeur de la direction de la prévision va jouer un rôle important dans ce cas.
- Document lié par Matt Austern: Pourquoi Vous ne devriez pas Utiliser jeu, et Ce que Vous Devez Utiliser à la Place.
Vous devez vous connecter pour publier un commentaire.
Coup de pouce.Conteneur flat_set
Démonstration en direct:
boost::flat_set peut le faire automatiquement:
La raison d'un tel contenant ne fait pas partie de la bibliothèque standard, c'est qu'il serait inefficace. À l'aide d'un vecteur de moyens de stockage d'objets doivent être déplacés si quelque chose est inséré dans le milieu du vecteur. Faire cela sur chaque insertion devient inutilement coûteux. (En moyenne, la moitié des objets devront être déplacés pour chaque insertion. C'est assez coûteux)
Si vous voulez un vecteur trié, il est probablement préférable d'insérer tous les éléments, et ensuite appeler
std::sort()
une fois, après les insertions.sort
une fois, et personnellement, je ne regarde pas pour un conteneur pour ce faire, mais c'est une affaire de style.sorted_vector
structure de données serait inefficace, je veux dire par rapport à une régulière vecteur est trié sur une base comme-nécessaire. Celle-ci a tous les avantages d'un vecteur trié, sans payer un inutile des coûts en matière d'insertion. Ainsi, l'ancien est inefficace.Je pense qu'il n'y a pas " triés contenant de l'adaptateur dans la STL, car il y a déjà approprié conteneurs associatifs pour garder les choses triés qui serait approprié d'utiliser dans presque tous les cas. Pour être honnête, la seule raison pour laquelle je peux penser à du haut de ma tête pour avoir une triés
vector<>
conteneur peut être à interagir avec les fonctions C qui attendent un tableau trié. Bien sûr, j'ai peut-être raté quelque chose.Si vous vous sentez qu'une triés
vector<>
serait plus approprié à vos besoins (en étant conscient des lacunes de l'insertion d'éléments dans un vecteur), voici une mise en œuvre sur le Code du Projet:Je n'ai jamais utilisé, donc je ne peux pas se porter garant pour elle (ou sa licence - si aucun n'est spécifié). Mais une lecture rapide de l'article, et il semble que l'auteur, au moins, a fait un bon effort pour l'adaptateur de conteneur de disposer d'une interface STL.
Il semble intéressant de regarder de plus près.
Si vous décidez de rouler vos propres, vous pourriez également vouloir vérifier boost:ublas. Plus précisément:
et de regarder coordinate_vector, qui met en oeuvre un vecteur de valeurs et indices. Cette structure de données prend en charge O(1) insertion (violation de la sorte), mais ensuite, sortes sur demande Omega(n log n). Bien sûr, une fois triés, les recherches sont en O(logn). Si une partie du tableau est trié, l'algorithme prend cela en compte et trie seuls les nouveaux éléments ajoutés, fait une place de fusion. Si vous vous souciez de l'efficacité, c'est probablement le meilleur que vous pouvez faire.
Alexandresu de Loki est un vecteur trié mise en œuvre, si vous ne voulez pas passer par la relativley non négligeable de l'effort de roulement vous sont propres.
http://loki-lib.sourceforge.net/html/a00025.html
Ici est mon sorted_vector classe que j'ai utilisé dans la production de code pour les années. Il a surcharges pour vous permettre d'utiliser un prédicat. Je l'ai utilisé pour des conteneurs de pointeurs, ce qui peut être vraiment une bonne solution dans beaucoup de cas d'utilisation.