2010-10-11 6 views
3

Comment puis-je créer std::list avec un nombre d'éléments fixes?std :: liste taille fixe

+8

La taille devrait être fixée pour toute sa durée de vie? Dans ce cas, pourquoi utilisez-vous une liste? Ses avantages sur les tableaux (et leurs wrappers, comme 'std :: vector' et' std :: array') sont principalement en termes d'insertion/suppression d'éléments, demandant une liste fixe ne demandant que ses inconvénients (plus de gaspillage de mémoire, accès aléatoire lent, ...). –

Répondre

8
#include <list> 

// list with 5 elements, using default constructor 
const size_t fixedListSize(5); 
std::list<int> mylist(fixedListSize); 

Si vous voulez qu'il ait toujours exactement 5 éléments que vous auriez à envelopper dans une classe de façade pour empêcher l'insertion et l'effacement.

Si cela est en effet ce que vous voulez, vous feriez mieux d'utiliser un conteneur différent au lieu de list, puisque, comme indiqué dans d'autres réponses, vous cacher les fonctionnalités les plus avantageuses de list.

+0

Voilà ce que 'const' est pour. –

+3

@Alf P. Steinbach: Pas vraiment. Faire la liste const désactivera l'insertion et la suppression, mais en même temps, il désactivera la modification du contenu réel de la liste. –

+1

Pourquoi la distribution? Un seul constructeur correspond à un appel avec un seul argument de type entier. –

2

Vous devez utiliser le constructeur std::list.

explicit list (size_type n, const T& value = T(), const Allocator& = Allocator()); 

Il suffit de spécifier au moment de la création le nombre exact d'éléments.

std::list<int> someList(20); 

Vous pouvez également spécifier une valeur initiale pour chaque élément.

std::list<int> someList(20, int(42)); 

std::list::resize est la bonne solution aussi.

10

Si vous voulez juste un conteneur de taille fixe, peut-être vous cherchez std::tr1::array. (Ou tout simplement std::array C++ 0x.)

Si vous n'insérez pas ou de supprimer des éléments que je ne pense pas qu'il y ait aucun avantage à utiliser std::list au lieu de std::array ou std::vector.

1

Je dois vous demander pourquoi vous voulez avoir un nombre fixe d'éléments et pourquoi utiliser une liste?

Il se peut que l'utilisateur implémente un cache avec un nombre limité d'éléments et une règle de suppression LRU. Dans ce cas, une liste est une bonne collection à utiliser. Chaque fois qu'un élément est accédé, vous épisserez cet élément au début de la liste. Si vous avez besoin d'insérer un nouvel élément (pour que la liste soit complète), vous devez quitter le dos de la liste.

Vous pouvez également maintenir une sorte de recherche pour les éléments, mais std :: list est la meilleure classe pour gérer LRU.

Questions connexes