目录
问一个问题,一个栈需要存储int类型数据,一个栈需要存储double类型数据,这两个栈同时在一个函数栈帧中存在,如何实现?
C语言为什么没有库?
因为写了,也用不了
C++的重大发布和更新,也是由于新的模板产生
语言的进化是编译器可以帮我们干更多的活
泛型编程
针对广泛的数据类型,而不是某一种数据类型
template<class T>
template<typename T>
它可以作为形参推演,也可以作为返回结果
这里跟auto是不一样的,auto不能做参数
参数是不限定,看你的需求,定义多少个模板参数
显示实例化
有些参数无法自动推演,所以需要显示实例化,指定模板参数的类型
当有两个不同类型时,调用就会存在歧义
显示实例化解决问题
还有一个问题为什么上面的代码,形参那里要加const?
因为隐式类型转换生成的临时变量具有常性,不加const会涉及权限放大
显示实例化的用处
(int)d 显示类型转换
类模板
问一个问题,一个栈需要存储int类型数据,一个栈需要存储double类型数据,这两个栈同时在一个函数栈帧中存在,如何实现?
stack s1; int
stack s2; double
类模板闪亮登场,注意::在这里也需要用到显示显示实例化
template<typename T>
class Stack
{
public:
Stack(size_t capacity = 3)
{
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
void Push(const T& data)
{
// CheckCapacity();
_array[_size] = data;
_size++;
}
~Stack()
{
if (_array)
{
free(_array);
_array = NULL;
_capacity = 0;
_size = 0;
}
}
private:
T* _array;
int _capacity;
int _size;
};
类名和类型
声明和定义暂时不能分离到两个文件,可以分离到类外面,但要重新加个模板参数,并且指定类型
模板参数只能给对应的类或函数用
普通类,类名和类型是一样
类模板,类名和类型不一样
类名:Stack
类型:Stack<T>
template<class T>
class Stack
{
public:
Stack(size_t capacity = 3);
void Push(const T& data);
// 其他方法...
~Stack()
{
if (_array)
{
free(_array);
_array = NULL;
_capacity = 0;
_size = 0;
}
}
private:
T* _array;
int _capacity;
int _size;
};
template<class T>
Stack<T>::Stack(size_t capacity)
{
/*_array = (T*)malloc(sizeof(T) * capacity);
if (NULL == _array)
{
perror("malloc申请空间失败!!!");
return;
}*/
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
template<class T>
void Stack<T>::Push(const T& data)
{
// CheckCapacity();
_array[_size] = data;
_size++;
}
// 惠普实验室 STL -- 标准模板库,常见的数据结构和算法的库
// 普通类,类名和类型是一样
// 类模板,类名和类型不一样
// 类名:Stack
// 类型:Stack<T>
STL
惠普实验室:STL --标准模板库,常见的数据结构和算法的库
是C++标准库的重要组成部分
STL的六大组件
容器就是数据结构
空间配置器就是内存池
string
管理字符串的类
管理字符数组,增删查改+算法
C++头文件不带.h与C语言进行区分
string几种初始化方式
这里的npos是缺省值,给的负一,又因为类型为size_t,因此它其实是大数
追加字符
C语言中的strcat不能扩容,
string追加会自动扩容
+=
pos下标位置,len长度
字符比较依旧是按ascll码比
将X转换成string
C语言中要提前预设好大小,string就不需要,因为它会自动扩容