模板函数
关键字
template<class T> or template <typename T> //只针对关键字下面的第一个函数有效
T add(T a, T b)
{
return a + b;
}
在学习模板函数的过程中,一定要先学习c++的编译过程
预处理是将宏展开,编译时将c++的语言变成汇编,汇编是将汇编代码转化成obj文件(目标文件),然后通过连接器生成可执行文件。
模板函数不会自动进行数据转化,必须是一一对应的使用。在实际调用过程中,编译的时候回对应生成魔板函数的实例化。比如在上面的模板函数中使用
int a = 10;
int b = 20 ;
add(a,b); //在调用过程中 模板函数会实例化一个函数 add_xxxx(int a, int b);
类模板
template <class T1,class T2>
class Pair
{
public:
T1 key; //关键字
T2 value; //值
Pair(T1 k,T2 v):key(k),value(v) { };
bool operator < (const Pair<T1,T2> & p) const;
};
template <类型参数表>
class 类模板名{
成员函数和成员变量
};
参数列表:<class类塑参数1, class类型参数2, …>
STL(模板库)
STL是Standard Template Library的简称,中文名标准模板库,STL是一些“容器”的集合,算法集合和其他一些组件的集合。STL的目的是标准化组件,这样可以不用重新开发。STL是一种泛型编程。面向对象的编程是数据方面的,而泛型编程关注的是算法。它们的共同点就是抽象和创建可重用代码。
在C++标准中,STL被组织为下面的13个头文件:、、、、、、
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。
容器
分为:序列式容器,适配器容器,关联式容器
序列容器
是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。
- 向量(vector) 连续存储的元素
- 列表(list) 由节点组成的双向链表,每个结点包含着一个元素
- 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组
适配器容器
关联式容器是非线性的树结构,更准确的说是二叉树结构。排序的容器底层是通过红黑树实现的,散列的是通过哈希表实现的。
- 栈(stack) 后进先出(LIFO)的值的排列
- 队列(queue) 先进先出(FIFO)的值的排列
- 优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列
关联式容器
- 集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素队的谓词排列,没有两个不同的元素能够拥有相同的次序
- 多重集合(multiset) 允许存在两个次序相等的元素的集合
- 映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列
- 多重映射(multimap) 允许键对有相等的次序的映射
- 对(pair) 和map类似,但只有一对键值
- 智能指针(auto_ptr) 将一个用new开辟内存的指针赋给auto_ptr,会自动回收空间