2 votes

Existe-t-il un moyen de fixer la taille du vecteur de manière à ce qu'il supprime automatiquement les éléments de l'avant ?

J'essaie de trouver le meilleur conteneur c++ avant de décider de définir ma propre structure de données.

Voici ce que j'essaie de faire : enter image description here

Par exemple, dans les vecteurs (C++), existe-t-il un moyen de fixer la taille de façon à ce que je puisse continuer à pousser et à faire sortir des éléments d'un côté et que, si je pousse plus d'éléments que la taille, cela supprime automatiquement les anciens éléments de l'avant.

Si ce n'est pas des vecteurs, autre chose ?

4voto

Christian Hackl Points 4763

Il n'existe pas de conteneur de ce type dans la bibliothèque standard C++, mais vous pouvez facilement créer le vôtre en enveloppant un conteneur existant. std::deque peut être approprié, car il est conçu pour permettre une insertion et une suppression rapides aux deux extrémités.

template <class T, int MaxSize>
class CircularContainer
{
static_assert(MaxSize >= 0);

public:
    void Add(T const& t)
    {
        if (MaxSize > 0)
        {
            if (size(data) == MaxSize)
            {
                data.pop_front();
            }
            data.push_back(t);
        }
    }

// ...

private:
    std::deque<T> data;
};

Il y a beaucoup de décisions à prendre en matière de conception, par exemple :

  • La taille maximale devrait-elle être totalement statique, fixée dans le constructeur ou éventuellement modifiable même après la création d'un objet conteneur ?
  • Quels itérateurs et références à des éléments sont autorisés à devenir invalides par des opérations telles que Add ?
  • Quelles parties de l'interface du conteneur enveloppé votre conteneur doit-il exposer ? A-t-il besoin de ses propres classes d'itérateurs ? for boucles, etc.
  • Souhaitez-vous autoriser une taille maximale de zéro et devez-vous optimiser les vérifications correspondantes avec la spécialisation des modèles ou l'utilisation d'un modèle ? constexpr if ?
  • La classe de conteneur enveloppée devrait-elle être un paramètre de modèle, tout comme std::stack le fait-il ?

La plupart de ces décisions de conception dépendront du fait que le conteneur sera utilisé dans le code de la bibliothèque ou dans le code de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X