成员模板2

#include <iostream>
#include <deque>
#include <vector>
#include <stdexcept>
using namespace std;

template <typename T, typename CONT = std::deque<T>>
class Stack
{
private:
	CONT elems;            // elements

public:
	void push(T const&);   // push element
	void pop();            // pop element
	T top() const;         // return top element
	bool empty() const 
	{   // return whether the stack is empty
		return elems.empty();
	}

	// assign stack of elements of type T2
	template <typename T2, typename CONT2>
	Stack<T, CONT>& operator= (Stack<T2, CONT2> const&);
};

template <typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{
	elems.push_back(elem);    // append copy of passed elem
}

template<typename T, typename CONT>
void Stack<T, CONT>::pop()
{
	if (elems.empty()) 
	{
		throw std::out_of_range("Stack<>::pop(): empty stack");
	}
	elems.pop_back();         // remove last element
}

template <typename T, typename CONT>
T Stack<T, CONT>::top() const
{
	if (elems.empty())
	{
		throw std::out_of_range("Stack<>::top(): empty stack");
	}
	return elems.back();      // return copy of last element
}

template <typename T, typename CONT>
template <typename T2, typename CONT2>
Stack<T, CONT>&
Stack<T, CONT>::operator= (Stack<T2, CONT2> const& op2)
{
	if ((void*)this == (void*)&op2)      // assignment to itself?
	{    
		return *this;
	}

	Stack<T2, CONT2> tmp(op2);         // create a copy of the assigned stack

	elems.clear();                   // remove existing elements
	while (!tmp.empty())             // copy all elements
	{           
		elems.push_front(tmp.top());
		tmp.pop();
	}
	return *this;
}

int main()
{
	try 
	{
		Stack<int>   intStack;       // stack of ints
		Stack<float> floatStack;     // stack of floats

		// manipulate int stack
		intStack.push(42);
		intStack.push(7);

		// manipulate float stack
		floatStack.push(7.7);

		// assign stacks of different type
		floatStack = intStack;

		// print float stack
		std::cout << floatStack.top() << std::endl;
		floatStack.pop();
		std::cout << floatStack.top() << std::endl;
		floatStack.pop();
		std::cout << floatStack.top() << std::endl;
		floatStack.pop();
	}
	catch (std::exception const& ex) 
	{
		std::cerr << "Exception: " << ex.what() << std::endl;
	}
	// stack for ints using a vector as an internal container
	Stack<int, std::vector<int> > vStack;
	//...
	vStack.push(42);
	vStack.push(7);
	std::cout << vStack.top() << std::endl;
	vStack.pop();

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值