Незважаючи на те, що я погоджуюсь з іншими, що безпосереднє використання ітеративного контейнера є кращим рішенням, я хочу зазначити, що стандарт С ++ гарантує достатню підтримку рішення «зроби сам», якщо ти хочеш це з якихось причин.
А саме, ви можете успадкувати std::queue
та використовувати його захищений член Container c;
для доступу до begin () і end () базового контейнера (за умови, що такі методи існують там). Ось приклад, який працює у VS 2010 та протестований із ideone :
#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
саме випадково підтримується перерахування, абсолютно довільно. Ви можете стверджувати, що цеdeque
повинно бути настільки ж пуристичним, якqueue
і не підтримувати ітерацію, і якщо ви хочете її повторити, то хочете щось «більше»; наприклад adeque_enumerable
. Однак це слизький схил, і моє особисте відчуття полягає в тому, щоqueue
в першу чергу слід було підтримати перелік.