Insérer dans une file d'attente STL en utilisant std::copy
Je voudrais utiliser std::copy
l'insertion d'éléments dans une file d'attente comme ceci:
vector<int> v;
v.push_back( 1 );
v.push_back( 2 );
queue<int> q;
copy( v.begin(), v.end(), insert_iterator< queue<int> >( q, q.front() ) );
Mais cela ne parvient pas à compiler, à se plaindre que begin
n'est pas un membre de std::queue
.
Note: j'ai essayé avec std::inserter
trop d'échec de cette procédure, cette fois en disant que "référence" n'est pas un membre de 'std::file d'attente'. std::back_inserter
et std::back_insert_iterator
aussi échouer avec le même message d'erreur.
Ai-je raté quelque chose d'évident, ou ne insert_iterator
s tout simplement pas travailler avec les files d'attente?
Bien que les réponses que vous avez été donné à sont bien, personnellement, je voudrais juste éviter de std::file d'attente et tous les autres paralysé adaptateur de conteneur.
Oui, sbi et Naveen la suggestion d'utiliser un deque serait une bonne alternative.
Oui, sbi et Naveen la suggestion d'utiliser un deque serait une bonne alternative.
OriginalL'auteur Andy Balaam | 2009-11-12
Vous devez vous connecter pour publier un commentaire.
Malheureusement
std::queue
'adapte' la fonction ditepush_back
justepush
ce qui signifie que la normeback_insert_iterator
ne fonctionne pas.Probablement la façon la plus simple (quoique conceptuellement laid) est l'adaptation de l'adaptateur de conteneur avec une courte durée conteneur adaptateur[sic] (eugh!) qui vit aussi longtemps que l'insert sur le dos d'itérateur.
Utilisée comme ceci:
Ce n'est pas
push_back
, parce que le point où les insertions se produire n'a pas d'importance sur le plan conceptuel. D'ailleurs, ce seraitpush_back
moyenne pour unpriority_queue
?Sur le plan conceptuel, cela fait sens, j'ai simplement utilisé le travail "malheureusement" parce que cela signifie qu'il ferme à l'aide de la
back_insert_iterator
qui pourrait être vraiment utile.Je suis d'accord avec Kylotan commentaire à la question. Si vous voulez faire des choses au-delà de ce que la file d'attente ADT permet (en gros, de pousser et de popping), il y a peu de point de la lutte contre la file d'attente de l'adaptateur. - +1 pour votre élégante réponse.
OriginalL'auteur CB Bailey
La file d'attente ne permettent pas d'itération à travers ses éléments.
De la SGI STL Docs:
Vous peut faire ce travail, mais vous ne peut pas utilisation
insert_iterator
. Vous aurez à écrire quelque chose commequeue_inserter
qui présente une interface iterator.Mise à jour je ne pouvais pas m'en empêcher et deicded pour essayer de mettre en œuvre l'itérateur vous avez besoin. Voici les résultats:
Cela fonctionne très bien pour des fonctions comme ceci:
Mais il ne fonctionne pas avec la STL copie parce que le TSL est stupide.
Sinon, votre réponse est raisonnable, cependant.
:)
+1Pourquoi ne pas mettre en œuvre la queue_inserter pour correspondre à la back_insert_iterator interface?
std::copy
n'est pas "stupide" (à mon humble avis!), il nécessite juste une sortie itérateur qui n'est pas déficitaire de l'interface.Votre queue_inserter n'est pas cessible, mais en dehors de cela, vous n'avez pas pour en tirer
iterator
, vous n'avez qu'à fournir une spécialisation pour lesiterator_traits
si vous souhaitez pouvoir utiliser votre itérateur avec des algorithmes standard.BTW,
std::copy
en particulier généralement des besoins pour en savoir plus sur les itérateurs, de sorte qu'il est possible de choisir un meilleur moyen de le faire: à l'e.g pointeurs + les Gousses peuvent être memmoved.OriginalL'auteur Frank Krueger
std::queue
n'est pas un conteneur de la STL sens, c'est un conteneur adaptateur avec des fonctions très limitées. Pour ce que vous semblez besoinstd::vector
oustd::deque
("double-clos de la file d'attente, qui est un "vrai conteneur"), semble le bon choix.Non il ne l'est pas. Voir Frank de réponse quant à la façon de réaliser ce que vous voulez.
Non, il ne fonctionne pas (fonctionnellement), mais vous devrez faire vos propres insertion malheureusement.
OriginalL'auteur sbi
Je suis assez sûr qu'il ne va pas fonctionner -- une file d'attente fournit
push
, mais un itérateur d'insertion s'attend à utiliserpush_front
oupush_back
. Il n'y a pas de véritable raison pour laquelle vous ne pouviez pas écrire votre proprepush_insert_iterator
(ou tout autre nom que vous préférez), mais c'est un peu de douleur...OriginalL'auteur Jerry Coffin
insert_iterator
etback_insert_iterator
seulement le travail sur les conteneurs (ou adaptateurs) à (respectivement)insert
etpush_back
méthodes -queue
n'a pas de ces. Vous pouvez écrire votre propre itérateur calqués sur ceux-ci, quelque chose comme ceci:Sauf si une telle chose existe déjà, mais je suis assez sûr qu'il ne l'est pas.
Il serait agréable d'avoir un itérateur dans la Bibliothèque Standard. Cependant, au sujet de votre mise en œuvre, je pense qu'il serait plus sûr d'avoir de la déférence opérateur renvoie un objet proxy au lieu de l'objet courant. En effet, le code tel qu'il est vous permet de faire des
push_iterator< queue< int > > it; it = 42;
, ce qui est faux (il permet aussi de faire******it
, ce qui n'est pas plus correct). Leoperator*
doit retourner un objet de définir lesoperator=
.Vous pouvez également ajouter à votre réponse habituelle fonction d'assistance permettant d'omettre le type de conteneur:
template < typename Container > push_iterator< Container > pusher( Container & c ) { return push_iterator< Container >( c ); }
.OriginalL'auteur Mike Seymour
Ce que vous avez besoin est un
push_inserter
(c'est à dire une insertion qui effectuepush
es dans la file d'attente). Autant que je sache, il n'existe pas d'itérateur dans la STL. Ce que je fais habituellement est malheureusement revenir à la bonne vieille boucle for.Si vous avez le courage, vous pouvez rouler vos propres itérateur, quelque chose le long de ces lignes:
Ce n'est qu'un projet mais vous avez l'idée. Fonctionne avec n'importe quel conteneur (ou, bien, conteneur des adaptateurs) avec un
push
méthode (par exemple,queue
,stack
).back_inserter
. Toutefois, cela ne fonctionne pas surstd::queue
.Je sais ce qu'est un back_insert_iterator est: un itérateur qui effectue push_back dans un récipient. La file d'attente n'a pas un push_back méthode, c'est pourquoi back_insert_iterator ne fonctionne pas. La méthode pour ajouter des éléments dans une file d'attente est de pousser, d'où le push_insert_iterator idée...
Considérant que "l'insertion" d'un élément dans une file d'attente se fait via la file d'attente::push (), fonction,
push_inserter
n'est pas un mauvais nom, à mon humble avisNon, il n'est pas. Pas du tout. Cependant, mon commentaire a été écrit avant Luc réponse jamais eu un
push_inserter
.:)
OriginalL'auteur Luc Touraille
std::queue
n'est pas l'un des conteneurs de la STL. C'est un récipient de l'adaptateur qui est construit à l'aide de la base de conteneurs STL ( dans ce cas, l'un des séquentielle récipientstd::vector
std::deque
oustd::list
). Il est conçu spécifiquement pour les FIFO comportement et de ne pas fournir de l'insertion aléatoire à l'itérateur que vous voulez pour leinsert_iterator
de travail. Par conséquent, il ne sera pas possible d'utiliser la file d'attente comme ça.La façon la plus simple que je pouvais penser pour le faire est:
Et de l'utiliser comme:
OriginalL'auteur Naveen
Dans ce cas simple, vous pouvez écrire:
Cela fera une copie de la
vector
et l'utiliser comme le conteneur sous-jacent de laqueue
.Bien sûr, cette approche ne fonctionnera pas si vous avez besoin de mettre en file d'attente les choses après la file d'attente a été construit.
la file d'attente ne peut pas utiliser un vecteur. Le conteneur doit prendre en charge
pop_front
.Argh! Vous avez raison. En raison de modèles, mon test n'a pas le montrer. Eh bien, je suppose que vous pouvez toujours créer une file d'attente qui vous permet d'inspecter
front()
etback()
... 😛OriginalL'auteur Thomas