Comment convertir std::file d'attente à std::vector
J'ai besoin de faire usage d'une file d'attente de double en raison des bonnes propriétés qu'il a ordonnée, conteneur. Je veux passer cette file d'attente à un constructeur de la classe qui accepte les vecteurs. Si je le fais directement, j'obtiens l'erreur suivante:
candidat constructeur pas viable: on ne connaît pas la conversion de
'std::file d'attente' pour 'std::vector &" pour la 2ème argument
La manière de voter, une file d'attente pour un vecteur?
Créer manuellement un vecteur à partir de la file d'attente des valeurs?
Avez-vous besoin de
Comment a été votre
Vecteur de gamme du constructeur est votre ami
Avez-vous besoin de
queue
à être modifiée?Comment a été votre
std::queue
déclaré? Le deuxième paramètre de modèle peut être utilisé pour définir le conteneur sous-jacent: si vous pouvez modifier la déclaration, choisissez std::vector
comme conteneur pour votre file d'attente et vous serez en mesure de faire quelques memcpyVecteur de gamme du constructeur est votre ami
OriginalL'auteur Anthony | 2016-08-01
Vous devez vous connecter pour publier un commentaire.
Le conteneur approprié pour modéliser les deux queue_like comportement et vecteur de type de comportement est un
std::deque
.Cela a pour avantages de:
constante de temps de l'insertion et de la suppression de l'une des extrémités de la deque
capacité à itérer les éléments sans détruire la deque
std::deque
prend en charge labegin()
etend()
méthodes qui signifie que vous pouvez construire un vecteur (compatible avec le type de valeur) directement.Un non-mutation de la conversion d'un
queue
à unvector
n'est pas possible.vrai, mais il n'y a aucun moyen de le faire sans souffrance soit une copie supplémentaire du conteneur ou d'une mutation (mouvement de)
La même chose est vraie de
deque
tho, votre dernière phrase ne veut pas dire.OriginalL'auteur Richard Hodges
std::vector
a un constructeur prenant une paire d'itérateurs, donc si vous souhaitez être en mesure d'effectuer une itération sur la file d'attente, vous serait fixé.Emprunt d'une réponse à cette question, en effet, vous pouvez le faire en sous-classement
std::queue
:(À noter que nous sommes en autorisant uniquement les
const
itération; pour le but de la question, nous n'avons pas besoin des itérateurs permettant de modifier des éléments.)Avec cela, il est facile de construire un
vector
:Vous pouvez également hériter privé ou de composer, mais ensuite, vous avez à exposer tous les sous-jacents de l'interface (par exemple, avec
using
). Ça dépend du contexte.Je vous remercie. J'ai compris.
OriginalL'auteur Ami Tavory
Je ne pense pas qu'il n'y a aucun moyen direct disponible.
Donc cela peut être réalisé en ajoutant des éléments un par un pour le vecteur.
Noter que la file d'attente est vide.
Comme suggéré par @David dans le commentaire, il serait bon d'éviter de copier les éléments de la file d'attente (utile en particulier lorsque les objets contenus sont gros). Utilisation
emplace_back()
avecstd::move()
pour atteindre le même:q.front()
plutôt que de les copier:v.emplace_back(std::move(q.front()));
. non le moins, vous avez ma upvote parce que c'est la seule réponse qui fait pratiqueOriginalL'auteur CinCout
C'est juste une approche pour éviter de copier de
std::queue
àstd::vector
. Je m'en remets à vous, si ou non de l'utiliser.Locaux
std::queue
est un conteneur de l'adaptateur. L'internecontainer
par défaut eststd::deque
, cependant vous pouvez le configurer pourstd::vector
. La variable membre qui détient ce contenant est marqué commeprotected
heureusement. Par conséquent, vous pouvez pirater par dérivation de l'queue
.Solution (!)
Que c'est!!
Utilisation
Démo.
Container c;
dans la norme donc, je suppose que tout conforme implémentations utilisentc
.Vecteur basé des files d'attente serait horriblement lent.
pourriez-vous fournir plus de détails sur ce qui se passe dans le
return->c
partie ? pas vraiment sûr que je le comprendsfait
std::vector
que le conteneur sous-jacent. La variable à l'intérieur destd::queue
qui détient ce conteneur est nommé commec
. Il doit être vrai pour tous conformes compilateurs. Maintenant à l'intérieur de lastd::queue
puisque vous avez lastd::vector
facilement disponible sous forme deprotected: c
, nous n'avons pas à convertir cettestd::queue
àstd::vector
explicitement à l'aide de la boucle d'itération. Au contraire, on peut tout simplement passer sur lec
en cas de besoin. Il doit êtrethis->c
parce quec
appartient à la classe de base par type de charge.et le type de charge signifie que le pointeur this prend type de la classe de base qui est T ?
OriginalL'auteur iammilind