2010-06-01 2 views
7

J'essaie d'utiliser BOOST_FOREACH pour parcourir la file d'attente std ::. Mais il n'y a pas itérateurs dans cette cause de la classe, j'ai une erreur:Itération dans la file d'attente std

std::queue<std::string> someList; 
BOOST_FOREACH(std::string temp, someList) 
{ 
    std::cout << temp; 
} 

>no matching function for call to begin(...) 
>no type named ‘iterator’ in ‘class std::queue<std::basic_string<char> >’ 

J'ai besoin dans la structure comme: la première vient, le premier va.

+1

Copie possible: http://stackoverflow.com/questions/1259099/ –

Répondre

19

std::deque prend en charge l'insertion et le retrait efficaces au début et à la fin de la structure de données. Vous pouvez effectuer des opérations de file d'attente manuellement en utilisant push_back et pop_front.

Une file d'attente utilise un deque interne par défaut. C'est un wrapper qui expose seulement les opérations de la file d'attente (d'où la raison pour laquelle vous ne pouvez pas itérer dessus). J'ai demandé un similar question un certain temps, et la meilleure réponse m'a donné un bon aperçu de l'utilisation réelle de std::queue. On devrait utiliser std::queue non pas parce qu'on a besoin d'une file d'attente, mais pour préciser que seules les opérations de type file d'attente sont légales sur une structure de données donnée. Il semble que vous ayez besoin de plus de liberté que cela, alors allez deque, list, ou une autre structure avec O (1) insert et supprime aux deux extrémités.

+0

Je pensais que la file d'attente est plus simple (perf + mem) que deque. Mais après votre réponse (et vérifié par le fichier d'en-tête), je pense qu'il n'y a pas de différence dans perf et la mémoire indépendamment de la file d'attente ou deque, à l'exception des restrictions sur certaines opérations en file d'attente. – Makesh

4

vous pouvez utiliser std :: liste avec push_front et pop_back

1

std::queue est un adaptateur de conteneur. Il utilise std::deque comme conteneur sous-jacent par défaut. L'accès à ce conteneur n'est pas possible et n'est donc pas une itération. Le meilleur moyen est d'utiliser un std::deque ou std::list et de gérer le comportement de la file d'attente vous-même. Peut-être fournir votre propre enveloppe autour de lui.