2017-04-21 4 views
0

Je suis en train de comprendre comment utiliser le constructeur suivant pour boost :: circular_buffer:C++ utilisant allocateur et initialiseur avec boost tampon circulaire

circular_buffer(capacity_type buffer_capacity, size_type n, const_reference item, const allocator_type& alloc = allocator_type()); 

J'ai une classe personnalisée:

template<class T> class Custom 
{ 
    public: 

    Custom() : 
     time(0.0) 
    {} 

    double time; 
    T data_; 
}; 

Avec mon tampon circulaire défini en utilisant le constructeur en prenant juste une capacité:

boost::circular_buffer<Custom<T>> buffer(10); 

Je n'ai pas J'ai beaucoup travaillé avec les allocateurs, et je veux initialiser mon tampon avec des valeurs par défaut/vide/zéro à la construction, et il semble que le constructeur mentionné ci-dessus est la façon de faire avec boost :: circular_buffer, mais je ne sais pas exactement comment avec constructeur boost. Si elle était un vecteur ordinaire, je suppose que je peux faire ce qui suit:

int num_elements = 10; 
Custom<T> custom; 
std::vector<Custom<T>> buffer(10, custom); 

je ne pouvais pas vraiment trouver des exemples sur ce particulier, de sorte que toute aide ou des conseils est appréciée.

Répondre

2

Tout comme votre appel std::vector où vous ne spécifiez pas d'allocateur pour Custom et utilisez la valeur par défaut, vous pouvez faire la même chose avec boost::circular_buffer. La seule différence est boost::circular_buffer a un paramètre supplémentaire vous permettant de définir la capacité et le nombre d'objets construits par défaut dans le tampon en même temps. Cela signifie que si vous voulez un boost::circular_buffer complet vous utilisez:

int num_elements = 10; 
Custom<T> custom; 
boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements, custom); 

qui vous donnent un boost::circular_buffer d'une capacité de num_elements avec num_elements par défaut des objets attribués en elle.

Vous pouvez également:

boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements/2, custom); 

qui définit la capacité de num_elements mais ne remplit que la moitié de la mémoire tampon (num_elements/2) avec des objets attribués par défaut. La seule raison pour laquelle vous devez utiliser un allocateur différent est que vous voulez que l'allocateur utilise un schéma d'allocation différent (comment il alloue réellement de la mémoire dans le système) à la valeur par défaut.

+0

Ok, c'est génial. Question: Maintenant, quand je repousse, le remplissage commence à la fin, car tous les éléments sont remplis, et ma taille retournera num_elements. Y at-il un moyen de contourner cela? Fondamentalement, je voulais des valeurs par défaut, donc à chaque fois que j'ai accédé au tampon [index] qui n'était pas encore rempli, mais toujours dans la capacité, il ne serait pas d'erreur. Mais je voulais en quelque sorte le comportement du tampon vide où la taille ne renvoie que les éléments que je repoussais spécifiquement et quand je repoussais explicitement cela commencerait au début (en ignorant le défaut). Vous ne savez pas si c'est même possible, pourrait avoir à surcharger certains opérateurs/méthodes? –

+0

@arias_JC Tout comme un vecteur, c'est l'un ou l'autre. soit vous le remplissez par défaut et remplacez par 'operator []' ou vous définissez sa capacité et vous le remplissez avec 'push_back()'. Vous pouvez envelopper le tampon dans votre propre classe et fournir la fonctionnalité que vous voulez si vous devez vraiment l'avoir. – NathanOliver