一、C++的模版
1、泛型编程
(1)概念
编写不依赖具体数据类型的程序
(2)目标
- 将程序尽可能通用
- 将算法从数据结构中抽象出来
(3)应用
- c++模版为范型程序设计提供了基础
- STL(标准模版库 Standard Template Library)是范型程序设计的例子
2、模板简介
(1)什么是模版
模板是支持参数化多态的工具,是一种对类型进行参数化的工具
(2)模板分类
函数模版
针对参数类型不同的函数
类模板
针对仅数据成员和成员函数类型不同的类
(3)工作方式
模版只是说明,需要实例化后才能执行和使用
- 函数模板 -> 模板函数
- 类模板 -> 模板类 -> 对象
->
:实例化
模板的声明和定义只能在全局、命名空间或类范围内进行
即不能在局部范围、函数内进行
3、函数模板
(1)概念
所谓函数模板,就是一个通用函数,返回值和参数类型不具体指定,使用虚拟类型来替代(占位符),这个通用函数就叫函数模版(Function Template)
(2)定义形式
一
1
2
3
4
5template<typename 类型参数>
返回类型 函数名(模版形参表)
{
函数体
}二
1
2
3
4
5template<class T>
返回类型 函数名(模版形参表)
{
函数体
}
template:声明模板的关键字
typename和class都是表示他们之后的参数都是一个类型的参数,class是早期c++版本使用的
(3)代码示例
1 | template<typename T> |
(4)重载
函数模版支持函数重载,参数列表不一样
编译器调用函数的顺序
1、先搜索参数完全匹配的普通函数
2、其次搜索参数匹配的模版函数
3、最后搜索自动类型转换后能匹配的普通函数
4、类模板
(1)简介
建立一个通用类
(2)代码具体实现格式
1 | // 声明类以及方法 |
二、STL
1、简介
(1)简单介绍
标准模版库
一些“容器”的集合:list、vector、set、map等等
标准化组件,实现可重用
六大部分
容器、迭代器、空间配置器、配接器、算法、仿函数
(2)详解
容器
一些封装数据结构的模板类,如:vector、list
算法
大量数据结构算法
迭代器
对容器中数据的读写通过迭代器实现
函数对象
将运算符重载为成员函数,这个类就称为函数对象类
适配器
将一个类的接口适配成用户指定的形式
内存分配器
内存申请和释放
(3)代码示例
1 | int main() { |
(a, a + 6)
赋予初值
vector:container(容器)
allocator
:allocator(分配器) 默认会有对应规则
count_if:algorithms(算法)
查询符合条件的元素个数
vi.begin()、vi.end():iterators(迭代器)
not1、bind2nd:函数适配器
not1:取反,统计大于等于40的数
less
:函数对象 查找所有小于int的数据,通过bind2nd:绑定40,查找所有小于40的数
2、容器
(1)简介
Sequence Container(序列式容器)
Array、Vectror、Deque、List、Forward-List
Associative Container(关联容器:key-value)
set(红黑树)、map、multiset/multimap
Unsorted Container(无定式容器,本质hash map)
通过Hash表的链地址法进行查找操作
(2)vector
a、简单介绍
封装了动态大小数组的顺序容器
功能:
- 动态数组
- 尾端增删元素
b、函数API
创建vector
1
2
3
4
5// 创建vector
vector<int> v1;
vector<int> v2(v1);
vector<int> v3(10, -1);
vector<string> v4(10, "hi");基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16int a[5] = {1, 2, 3, 4, 5};
// 本质为一个模板类
// 半开区间:[&a[0], &a[5])
vector<int> vt(&a[0], &a[5]);
// 1 第一个元素
cout << "first data = " << vt.front() << endl;
// 2 最后一个元素
cout << "last data = " << vt.back() << endl;
// 3 元素个数
cout << "data size = " << vt.size() << endl;
// 4 输出数组
for (int i = 0; i < vt.size(); ++i)
{
cout << vt[i] << " ";
}
cout << endl;
c、迭代器
简介:
迭代器是一个复杂的指针,可以读写容器中的对象,本质为运算符的重载
格式:
vector<int>::iterator iterator = vt.begin();
使用范例
vector<int>::iterator it; for(it = vt.begin(); it != vt.end(); ++it) { cout << *it << endl; }