版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26822029/article/details/81075067
在《C++ Templates》第三章介绍类模板的概念,并借助vector实现Stack类模板。实现代码如下:
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
template <typename T>
class Stack {
private:
vector<T> elems;
public:
void push(T const&);
T pop();
T top() const;
bool empty() const {
return elems.empty();
}
};
template <typename T>
void Stack<T>::push(T const& e_em)
{
elems.push_back(e_em);
}
template <typename T>
T Stack<T>::pop()
{
if (elems.empty()) {
throw out_of_range("Stack<>::pop() : empty stack");
}
T elem = elems.back();
elems.pop_back();
return elem;
}
template <typename T>
T Stack<T>::top() const
{
if (elems.empty()) {
throw out_of_range("Stack<>::top() : empty stack");
}
return elems.back();
}
int main()
{
Stack<int> stack;
stack.push(1);
stack.push(3);
cout << stack.pop();
return 0;
}
其实类模板的应用方法和函数模板的应用方法大同小异,通过仔细阅读上面的代码相信你能够掌握其基本用法。下面就这段代码进行学习小结:
1.类模板Stack<>是通过C++标准库的类模板vector<>来实现的。可以将vector看作动态数组,当其申请的空间用完时,能够自动申请一块新的空间,然后将现有内容复制到新空间中再释放旧空间。在使用可以手动指定初始大小,如:std::vector<int> vec(10);也可以不指定大小,使用默认的值,空间大小的管理完全交给模板来控制。vector的函数使用文档在这里可以了解一下。常用的如push_back()将在数组尾部追加元素,pop_back()将在数组尾部移除元素。
2. stdexcept头文件是C++标准库定义的异常处理库。stdexcept定义了一些标准的异常类,主要分为两大类:逻辑错误和运行时错误。
在示例代码中使用了out_of_range异常函数,如果发生异常会打印如下错误并推出程序: