Obwohl ich anderen zustimme, dass die direkte Verwendung eines iterierbaren Containers eine bevorzugte Lösung ist, möchte ich darauf hinweisen, dass der C ++ - Standard eine ausreichende Unterstützung für eine Do-it-yourself-Lösung garantiert, falls Sie dies aus irgendeinem Grund wünschen.
Sie können nämlich von std::queue
seinem geschützten Mitglied erben und verwenden, Container c;
um auf begin () und end () des zugrunde liegenden Containers zuzugreifen (vorausgesetzt, solche Methoden sind dort vorhanden). Hier ist ein Beispiel, das in VS 2010 funktioniert und mit ideone getestet wurde :
#include <queue>
#include <deque>
#include <iostream>
template<typename T, typename Container=std::deque<T> >
class iterable_queue : public std::queue<T,Container>
{
public:
typedef typename Container::iterator iterator;
typedef typename Container::const_iterator const_iterator;
iterator begin() { return this->c.begin(); }
iterator end() { return this->c.end(); }
const_iterator begin() const { return this->c.begin(); }
const_iterator end() const { return this->c.end(); }
};
int main() {
iterable_queue<int> int_queue;
for(int i=0; i<10; ++i)
int_queue.push(i);
for(auto it=int_queue.begin(); it!=int_queue.end();++it)
std::cout << *it << "\n";
return 0;
}
deque
die Aufzählung nur völlig willkürlich unterstützt wird. Sie könnten genauso gut argumentieren, dassdeque
dies genauso puristisch sein solltequeue
und die Iteration nicht unterstützen sollte, und wenn Sie es iterieren möchten, möchten Sie etwas "mehr"; zB adeque_enumerable
. Es ist jedoch ein rutschiger Hang, und mein persönliches Gefühl ist, dassqueue
dies die Aufzählung an erster Stelle hätte unterstützen sollen.