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.