一、什么是类模板
在C++中,类模板是一种通用的类定义,可以将类型参数化,使得该类可以适用于多种数据类型。类模板中的成员函数和成员变量是没有具体实现的,只有在使用时才被实例化。使用类模板的主要优点是可以减少代码冗余,提高代码复用性,降低维护成本。
template
class Stack {
private:
T* _data;
int _top;
int _size;
public:
Stack(int size = 100) : _data(new T[size]), _top(-1), _size(size) {}
~Stack() { delete[] _data; }
void push(T val);
T pop();
bool isEmpty() const { return _top == -1; }
bool isFull() const { return _top == _size - 1; }
};
template
void Stack::push(T val) {
if (isFull()) {
throw std::overflow_error("Stack is full.");
}
_data[++_top] = val;
}
template
T Stack::pop() {
if (isEmpty()) {
throw std::underflow_error("Stack is empty.");
}
return _data[_top--];
}
二、类模板的使用
使用类模板需要指定具体的类型,可以采用显式实例化或隐式实例化两种方式。
显式实例化是在代码中指定类型参数,编译器会将模板代码实例化成具体类型的代码,生成可执行文件。
void testStack() {
Stack intStack;
intStack.push(1);
intStack.push(2);
intStack.push(3);
cout << intStack.pop() << endl;
cout << intStack.pop() << endl;
cout << intStack.pop() << endl;
}
void testStack2() {
Stack strStack;
strStack.push("hello");
strStack.push("world");
cout << strStack.pop() << endl;
cout << strStack.pop() << endl;
}
int main() {
testStack();
testStack2();
return 0;
}
隐式实例化是在代码中不指定类型参数,编译器会根据函数参数推导出类型,自动实例化成具体类型的代码。
template
void printSize(Stack s) { // 隐式实例化
cout << "stack size = " << sizeof(s) << endl;
}
int main() {
Stack s;
printSize(s);
return 0;
}
三、通用数据结构的实现——栈
使用类模板可以轻松定义通用数据结构,例如栈、队列、链表等。
栈(Stack)是一种后进先出(LIFO)的数据结构,支持插入、弹出操作。栈可以使用数组或链表实现。下面是一个使用类模板实现的栈:
template
class Stack {
private:
T* _data;
int _top;
int _size;
public:
Stack(int size = 100) : _data(new T[size]), _top(-1), _size(size) {}
~Stack() { delete[] _data; }
void push(T val);
T pop();
bool isEmpty() const { return _top == -1; }
bool isFull() const { return _top == _size - 1; }
};
template
void Stack::push(T val) {
if (isFull()) {
throw std::overflow_error("Stack is full.");
}
_data[++_top] = val;
}
template
T Stack::pop() {
if (isEmpty()) {
throw std::underflow_error("Stack is empty.");
}
return _data[_top--];
}
int main() {
Stack s; // 创建一个整型栈
s.push(1);
s.push(2);
s.push(3);
while (!s.isEmpty()) {
cout << s.pop() << endl;
}
return 0;
}
四、总结
类模板是C++中定义通用数据结构的重要手段,能够实现类型参数化,代码复用性高。使用类模板定义的数据结构可以适用于不同的数据类型,且代码简洁,易于维护。
在实际编程中,使用类模板可以大大提高代码复用性和编程效率,是C++程序员必须掌握的技能之一。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/280852.html
微信扫一扫
支付宝扫一扫