【C++初阶】C++ 模板与 string 类详解
模板
当我们写交换两个元素的函数时,通常会这样写:
代码语言:javascript
AI代码解释
void swap(int& x, int& y) { int tmp = x; x = y; y = tmp; }但是,如果要交换long long类型、double类型,甚至自定义类型,就需要写多个函数了。
为了解决这个问题,C++ 引入了模板这个概念。
1. 函数模板
代码语言:javascript
AI代码解释
template<class T> void swap(T& a1, T& a2) { T tmp = a1; a1 = a2; a2 = tmp; }注意点:
class可以改成typename,现阶段两者没有区别- 实质:编译器自动推断,生成对应函数(类比类的实例化,称为模板的实例化)
- 同一个
T不能代表不同类型
代码语言:javascript
AI代码解释
int a = 1; double b = 2.0; swap(a, b); // 报错:"swap": 未找到匹配的重载函数处理不同类型的参数
方法1:强制类型转换
代码语言:javascript
AI代码解释
template<class T> T add(const T& a, const T& b) { return a + b; } cout << add(a, (int)b) << endl;这种方法有很多局限性。
方法2:显式实例化
代码语言:javascript
AI代码解释
add<int>(a, b); // 在前面加上类型方法3:定义两个模板参数
代码语言:javascript
AI代码解释
template<class T1, class T2> T1 add(const T1& a, const T2& b) { return a + b; }模板参数作为返回值
有些时候,编译器无从推断T的类型:
代码语言:javascript
AI代码解释
template<class T> T* func(int n) { return new T[n]; }这个时候就必须显式实例化:
代码语言:javascript
AI代码解释
int* a = func<int>(5);模板与普通函数的优先级
代码语言:javascript
AI代码解释
template<class T1, class T2> T1 add(const T1& a, const T2& b) { return a + b; } int add(const int a, const int b) { return a + b; }根据调试结果,优先调用对应的普通函数。
2. 类模板
为方便理解,先写一个简单的栈类:
代码语言:javascript
AI代码解释
template<class T> class stack { public: stack(int n = 4) : capacity(n) , size(0) , _arr(new T[n]) { } ~stack() { delete[] _arr; _arr = nullptr; capacity = 0; size = 0; } void push(const T& s) { if (capacity == size) { T* tmp = new T[2 * capacity]; memcpy(tmp, _arr, sizeof(T) * size); delete[] _arr; capacity *= 2; _arr = tmp; } _arr[size++] = s; } private: size_t capacity; size_t size; T* _arr; };注意:类模板必须显式实例化
代码语言:javascript
AI代码解释
stack<int> st1; stack<double> st2;这样,就可以让栈中存储不同类型的元素了。
声明与定义分离
代码语言:javascript
AI代码解释
// 声明 template<class T> class stack { public: // ... void push(const T& s); // ... }; // 定义 template<class T> void stack<T>::push(const T& s) { if (capacity == size) { T* tmp = new T[2 * capacity]; memcpy(tmp, _arr, sizeof(T) * size); delete[] _arr; capacity *= 2; _arr = tmp; } _arr[size++] = s; }甚至可以使用不同的模板参数名:
代码语言:javascript
AI代码解释
template<class X> void stack<X>::push(const X& s) { // ... }这也可以证明模板实质上是编译器自动生成特定元素类型的类。
有了模板,C++ 就可以写一份代码,无伤兼容各种类型,这就诞生了STL:让顺序表、栈、队列等数据结构由编译器帮你生成。
C++ string 类详解
简介
在认识 string 之前,先介绍两个有用的网站:
- C++ 官方文档
- 优点:更新及时
- 缺点:较杂乱
在接下来的内容中,我们将使用非官方文档进行讲解。
1. 使用方法
注意:这里的一些代码不需要彻底理解,我们在模拟实现部分会详细讲解。
