Je dispose d'une application consommatrice qui doit stocker un maximum de 100 objets dans une liste pour se nourrir d'un rappel pour le traitement, car il sera redondant de conserver des données anciennes si le consommateur ne se rattrape pas. Au fur et à mesure que de nouvelles données sont arrivées, il peut simplement écraser l'élément le plus ancien. P>
Je pensais à utiliser un conteneur de tampon circulaire et je deviné que cela serait deque, mais constaté qu'il n'utilise pas la liste circulaire, tout aussi bien que l'option pour définir une taille maximale fixe. p>
Il existe une méthode max_size dans Dequeue, mais la documentation indique "Il s'agit de la taille maximale potentielle que le conteneur peut atteindre en raison des limitations de mise en œuvre du système ou de la bibliothèque." P>
Y a-t-il un autre conteneur que je peux utiliser? p>
PS: J'utilise Visual C ++ 2010 Express P>
4 Réponses :
Il n'y a pas de conteneur de bibliothèque standard qui fait ce que vous voulez directement. Cependant, vous devez consulter Conteneur de tampon circulaire de Boost . Si vous ne pouvez pas utiliser Boost, vous pouvez au moins afficher sa source et le refaire. p>
@Thomas: Et j'ai explicitement dit qu'il n'y ait rien et suggère une alternative. Que préférez-vous, pas de réponse du tout?
@Gman, aucune infraction prévue. Je pense juste qu'il est inapproprié de se référer à Boost lorsqu'il existe des solutions simples à base de stl. Pour diverses raisons, Boost n'est pas une option pour certaines personnes.
@THOMAS: Il existe des solutions basées sur STDLIB sans doute, et elles peuvent être mises en œuvre en examinant le code source de boost ... comme je l'ai suggéré. Si vous le souhaitez, je peux aussi jouer à la carte de pédant.
@THOMAS Pour tout cas où "Boost n'est pas une option" La solution ne colle pas religieusement de rien, mais plutôt de préparer vos arguments, de vous affûter la langue et de parler aux bonnes personnes.
@wilhelmtell: Je n'aurais pas pu le dire mieux.
@THOMAS: C'est bon, si vous voulez basculer, alors faites-le, c'est pour vous de décider. :) (Si vous avez vraiment changé votre position, faites-le-moi savoir, mais ne vous sentez pas sous pression.)
@Wilhelm, je ne sais pas ce que vous essayez de suggérer par ce commentaire. Cela signifie-t-il que toutes les situations développeurs devraient pouvoir utiliser Boost s'ils ont une touche tranchante, des arguments bien préparés et parler aux bonnes personnes? Si tel est le cas, je vous prie de différer. Si vous développez sous contrat qui indique «des bibliothèques standard uniquement», demandez-vous deux séries d'avocats à s'impliquer sur la question? Si vous êtes à l'école et que le professeur dit «Utilisez STL», affirmez-vous que vous devez activer votre affectation en utilisant Boost?
@Gman, je relisons les raisons du vote en baisse sur Meta et ma raison ne semble pas être valable, selon certains postes là-bas.
Pourquoi pas simplement utiliser un vecteur avec un index qui incrémente MOD 100 chaque fois qu'un nouvel objet est ajouté? Quelque chose comme ça, de toute façon. P> P>
Je roule généralement mes propres tampons circulaires avec des listes liées (je suppose que ce serait le conteneur STL "Liste"). Cela fonctionne bien que si vous avez besoin de beaucoup d'accès aléatoire aux éléments. Vous pouvez écrire une classe contenant une liste liée et maintenir la taille vous-même (ajoutez l'élément à l'arrière, si Taille> Seuil {Retirez l'élément à l'avant}, etc.). Vous pouvez également créer des tampons circulaires avec des tableaux / vecteurs normaux en maintenant et en emballant des indices de la tête et de la queue, mais vous serez peut-être mieux avec le boost mentionné par Gman. p>
Pourquoi utiliser une liste liée sur un tableau contigu? Les inconvénients des listes liées pour cela sont la charge d'allocator, la tête de mémoire et la fragmentation (cache misses). L'avance est que c'est probablement légèrement plus facile à l'auteur.