C++另一种编程思想称为泛型编程 主要利用的技术就是模版 提高复用性
C++提供两种模版机制:函数模版和类模版
template<typename T> 声明一个模版,告诉编译器后面的代码中紧跟着的T是一个通用数据类型不要报错 template声明创建模版 typename表明后面的符号是一种数据类型 可用class代替
void myswap(T &a,T &b) 自动类型推导的情况下 声明了了模版则函数中必须指定T
{
T temp=a;
a=b;
b=temp;
}
使用:
方式一:自动类型推导
myswap(a,b); a,b使用前肯定要定义 编译器就会知道他们的类型 但必须形参推导出同一种数据类型才可用 因为是两个T类型
方式二:显式指定类型
myswap<int>(a,b); 直接告诉它a b是int类型
函数模版 使用自动类型推导 不可以发生隐式类型转换
显式指定类型 可以发生隐式类型转换
同时有函数和模版函数时 可以通过空模板参数列表来强制调用函数模版
myswap<>(a,b);调用模版 myswap(a,b);调用函数
函数模板也可以重载
如果模板有更好的类型匹配 系统会优先调用模版 即使不加空模版参数列表
最好是不要让模版函数和函数同时出现
类型之间的属性操作不一定通用
局限性:如数组之间不能直接用等号赋值
C++为特定类型提供具体化的模板(重载)
学习模版不是为了写而是为了用
类模版语法与函数一样就是把函数名改为类名
类模版没有自动类型推导的使用方式
类模版在参数列表中可以有默认参数
普通类中的成员函数一开始就可以创建,类模版中的成员函数在调用时才创建
STL(标准模板库)
六大组件 容器 算法 迭代器 仿函数 适配器 空间适配器
序列式容器:强调值的排序,每个元素均有固定的位置
关联式容器:二叉树结构,元素间没有严格的顺序关系
质变算法:运算中会更改区间内元素内容 如替换 删除等
非质变算法:不会更改区间内元素内容 只是查找 计数等
迭代器:提供一种方法,使之能够依序寻访某个容器所含的各个元素,每个容器都有自己的专属迭代器
#include<vector>
vector<int> v; 类型 容器名
尾插数据 v.push_back(10);
通过迭代器访问容器中的数据
vector<int>::iterator itBegin=v.begin(); 起始迭代器指向容器中第一个元素
itEnd=v.end(); 结束迭代器 指向容器中最后一个元素的下一个位置
第一种遍历方式:
while(itBegin!=itEnd)
{
cout<<*itBegin<<endl;
itBegin++;
}
第二种遍历方式(常用)
for(vector<int>iterator it=v.begin;it!=v.end();it++)
{
}
第三种
#include<algorithm>
void myprint(int val)
{
cout<<val<<endl;
}
for_each(v.begin(),v.end(),myprint);
容器中可以存放类、指针
容器中嵌套容器 vector<vector<int>> v;
string 就是一个内部封装了char*的类
=assign +=append 查找find rfind 替换replace 对比compare 插入insert 删除erase 截取子本substr
存取 [下表] at(int n)
vector 单端数组 可以动态扩展 空间上不是续接空间,而是整体移到新的大空间
通过区间构造容器 vector<int>v2(v1.begin(),v1.end());
n个elem方式
vector<int>v3(10,100); 10个100加入到容器
empty 判断容器是否为空
capacity 容量
size 元素个数
resize 重新指定容器长度
push_back 尾部插入
pop_back 删除最后一个元素
insert 迭代器指向位置插入元素
erase 删除迭代器指向的元素
clear 删除容器中所有元素
at 返回索引所指的数据
\] 返回索引所指的数据
front 第一个元素数据
back 最后一个元素数据
swap(vec) 互换容器数据
巧用swap收缩内存 vector\