### C++模板与STL学习 #### 5.1 使用模板的意义 模板是C++语言的一个强大特性,它允许我们编写能够处理不同数据类型的通用代码。通过使用模板,我们可以减少代码重复并提高代码的可维护性。下面我们将详细介绍模板的概念及其在栈(Stack)这一数据结构中的应用。 ##### 示例: IntStack 与 DoubleStack 考虑两个简单的栈类:`IntStack` 和 `DoubleStack`。`IntStack` 只能存储整数,而 `DoubleStack` 存储双精度浮点数。 ```cpp class IntStack { public: IntStack(unsigned int); bool pop(); bool push(int); int readTop(); bool isEmpty(); private: int *data; unsigned int top; unsigned int size; }; class DoubleStack { public: DoubleStack(unsigned int); bool pop(); bool push(double); double readTop(); bool isEmpty(); private: double *data; unsigned int top; unsigned int size; }; ``` ##### 模板类 尽管 `IntStack` 和 `DoubleStack` 类似,但它们的实现代码是重复的。为了解决这个问题,我们可以使用模板来创建一个通用的栈类: ```cpp template<typename T> class Stack { public: Stack(unsigned int); bool push(T); T readTop(); // ... 其他成员函数 ... private: T *data; unsigned int top; unsigned int size; }; ``` 模板类允许我们在编译时确定类型 `T`。这使得我们能够使用同一个类实现多种类型的栈,如 `Stack<int>` 和 `Stack<double>`。 ##### 方法定义 模板类的方法定义也需要包含模板声明: ```cpp template<typename T> bool Stack<T>::push(T t) { if (top >= size) return false; data[top] = t; top++; return true; } ``` ##### 使用模板类 使用模板类的方式类似于普通类,只需在实例化时指定类型参数: ```cpp int main() { Stack<int> si(10); Stack<double> sd(10); si.push(3); si.pop(); sd.push(3.14); sd.push(2.15); return 0; } ``` #### 5.2 模板函数 模板函数的工作原理类似于模板类,但用于函数而不是类。它可以处理任何类型的数据,并允许我们编写一次代码,多次使用。 ##### 示例: 排序函数 假设我们需要编写一个排序函数,该函数能够处理不同类型的数据。如果我们不使用模板,可能会有多个重载版本: ```cpp void sort(int a[], int len); void sort(double a[], int len); void sort(char a[], int len); ``` 但是,如果所有的排序算法都是相同的,那么我们可以使用模板函数来避免这种代码重复: ```cpp template<typename T> void sort(T a[], int len) { // 排序算法实现... } A arr[10]; // 假设 A 是一个用户自定义类型,且实现了 < 运算符 // ... 给 arr 赋值 sort(arr, 10); // 调用模板函数 ``` ##### 实现数组翻转的模板函数 接下来,我们实现一个模板函数来翻转数组中的元素: ```cpp template<typename T> void reverseArray(T arr[], int len) { for (int i = 0; i < len / 2; ++i) { std::swap(arr[i], arr[len - i - 1]); } } ``` 使用示例: ```cpp int main() { int arr[] = {1, 2, 3, 4, 5}; double darr[] = {1.1, 2.2, 3.3, 4.4, 5.5}; reverseArray(arr, 5); reverseArray(darr, 5); // 输出翻转后的数组 for (int i = 0; i < 5; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; for (int i = 0; i < 5; ++i) { std::cout << darr[i] << " "; } std::cout << std::endl; return 0; } ``` 以上示例展示了如何使用模板来编写通用的、可维护的代码。模板不仅提高了代码的复用性,还使得代码更加简洁明了。 #### 5.3 STL简介 STL(Standard Template Library,标准模板库)是C++标准库的一部分,提供了一系列通用的数据结构和算法。STL主要包括以下几个部分: - **容器**:如 vector、list、set 等,提供了高效的数据存储机制。 - **迭代器**:一种通用访问容器元素的方式。 - **算法**:如 sort、reverse 等,提供了一组高效的操作容器的方法。 - **函数对象**:提供了可调用的对象,可用于自定义算法行为。 - **分配器**:管理内存分配和释放的机制。 STL的设计理念是分离数据和算法,这使得程序员可以专注于业务逻辑,而不必关心底层实现细节。 通过学习模板和STL,我们可以编写出更加高效、可维护的代码,并利用现有的库功能来加速开发过程。
剩余63页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一个相当完整的与 VB6 兼容的 DirectX 11 类型库.zip
- 一个用 DirectX11 编写的 helloworld OpenVR 程序 .zip
- 一个玩具 c++,directX 游戏引擎 .zip
- 基于计算机视觉yolov5算法实现小鼠肿瘤块检测及尺寸大小预测系统python源码+模型+测试数据.zip
- QML系统整机测试模板,包含磁盘阵列RAID管理、系统压力测试、整机拷机测试、日志收集、用户权限管理
- NVIDIA GeForce 7 Series显卡驱动下载
- 一个正在开发的现代 C++20 跨平台游戏引擎,带有 C# 脚本 .zip
- sssssssseffffffffffssdddd
- 使用kettle完成数据集管理.pptx
- 一个挂接 DirectX 并显示简单 AntTweakBar 菜单的示例项目 .zip