#include <queue>
template <class T>
class Queue : protected std::queue<T>
{
public:
using std::queue<T>::empty;
using std::queue<T>::size;
using std::queue<T>::front;
using std::queue<T>::back;
using std::queue<T>::push;
using std::queue<T>::pop;
void swap(Queue<T>& q) {using std::swap; swap(this->c, q.c);}
};
#include <stack>
template <class T>
class Stack : protected std::stack<T, std::vector<T> >
{
public:
typedef std::size_t size_type;
using std::stack<T, std::vector<T> >::empty;
using std::stack<T, std::vector<T> >::size;
using std::stack<T, std::vector<T> >::top;
using std::stack<T, std::vector<T> >::push;
using std::stack<T, std::vector<T> >::pop;
void reserve(size_type n) {this->c.reserve(n);}
void swap(Stack<T>& s) {using std::swap; swap(this->c, s.c);}
};
int main()
{
Stack<int> s;
s.reserve(100);
s.push(1);
s.push(2);
s.pop();
printf("stack size:%d\n", s.size());
Stack<int>().swap(s);
printf("----- swap -----\n");
printf("stack size:%d\n", s.size());
Queue<int> q;
q.push(1);
q.push(2);
printf("queue size:%d\n", q.size());
Queue<int>().swap(q);
printf("----- swap -----\n");
printf("queue size:%d\n", q.size());
}