05模板
c++支持的编程风格:
- 面向过程:解决问题的过程
- 面向对象:
- 泛型编程:
写好的代码具有通用性,与具体的类型无关
在c++中实现泛型编程的机制,成为模板
模板分为
- 模板函数
- 模板类
模板就是一个函数或是一个类,与一般的函数或类的差别是,它可以把类型抽象出来。作为参数!!
语法 : template<typename T,...>
T 函数名(T 参数名,...)
{
//函数体
};
template<typename T,...>
class 类名
{
public:
T 成员函数名(T 形参,...)
{
//函数体
}
private:
T 成员变量名;
...
};
当调用函数,或都用类来实例化对象时,编译器先更具传入的类型名,
生成相应的函数代码 或 生成相应的类
最后再调用生成的函数 或 用生成的类创建对象!
模板类的使用说明:
- 使用模板类型实例化对象时,必须制定模板参数!
Sum<int> i(1,3);
- 如果在模板类外定义成员函数,那么成员函数也必须带上模板声明
//要说明T和Sum的类型
template<typename T>
T Sum<T> :: sum()
{
return a + b;
}
- 一旦使用模板机制,那么函数的声明或类的声明,必须与 它们的定义在同一个文件中(一般都在头文件中)!!!
#include <iostream>
using namespace std;
// int sum(int a,int b)
// {
// return a + b;
// }
//一种类型
template<typename Type>
Type sum(Type a,Type b)
{
return a + b;
}
//两种类型
template<class T1,class T2>
T2 sum(T1 a,T2 b)
{
return a + b;
}
int main(int argc, char const *argv[])
{
cout << sum(1,2) << endl;
cout << sum(1.1,1.2) << endl;
cout << sum(string("hello"),string("world")) << endl;
cout << sum(1,'a') << endl;
return 0;
}
练习:
写一个函数模板,能实现求任意两个对象的和
如 复数!
写一个模板类,实现一个动态数组的常规功能,如添加,删除,查看指定位置的元素,修改任意位置的值
Array<int> ia;
Array<double> da;
把以前的那个链表类,改造成模板类
List<int> ilist;
List<string> slist;
...
标准模板库 Standard Template Library (STL)
主要组成部分:
- 容器:可以存储其他对象的对象,
顺序容器:
如数组,字符串,链表,栈,队列
vector list stack dqueue ....
关联容器(map):没有严格的顺序之分,关联容器中存放的不是单个的元素,而是元素对(键值对 key-value)! 也称为字典!
如:颜色名 与 颜色值
"red" 0xff0000
如:员工编号 员工姓名
- 算法:就是用函数模板实现的常见的算法
- 如 :查找 排序 乱序 合并 ...
- 迭代器(Iterator):用面向对象的技术封装起来的具有同指针类似功能的对象,能用于连接容器与算法
如 操作数组的指针,就可以把这个指针理解为数组的迭代器
- 创建
vector<类型> 对象名;
- 添加
push_back()
- 修改
[]
- 删除
pop_back()
- 遍历
- i
- iterator
- for(auto 变量:容器)
- {}
- 查找
- []
- find
- 大小
- size()
- 判空
- empty()
- 清空
- clear()
eg:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void showVect(auto &v)
{
// for (int i = 0; i < v.size(); ++i)
// {
// cout << v[i] << " ";
// }
// cout << endl;
//用迭代器来实现
for (std::vector<int>::iterator it = v;it != v.end();++ it)
{
cout << *it << " ";
}
//将
for (int value:v) //&value :可以改 //const &value :不可以改
{
cout << value << " ";
}
cout << endl;
}
template<typename T>
void showVect(T &v)
{
//用迭代器来实现
for (auto it = v;it != v.end();++ it)
{
cout << *it << " ";
}
cout << endl;
}
template<typename T>
class Greater
{
public:
Greater();
~Greater();
};
int main(int argc, char const *argv[])
{
vector<int> iv; //创建一个整数数组
cout << iv.size() << endl; //一开始元素个数为0
iv.push_back(100); //末尾增加元素
iv.push_back(200);
iv.push_back(300);
cout << iv.size() << endl;
cout << iv[1] << endl; //下标操作:访问指针位置的元素 可读可写
cout << iv.at(2) << endl; //访问元素:只读
sort(iv.begin(),iv.end(),Lesser()); //升序
showVect(iv);
sort(iv.begin(),iv.end(),Greater()); //降序
showVect(iv);
//std::vector<int>::iterator it = find(iv.begin(),iv.end(),200); //查找
auto it = find(iv.begin(),iv.end(),200); //auto 自动推导对象类型
if(it != iv.end()) //找到了
{
cout << "find value = " << *it << endl;
}
else
{
cout << "not found" << endl;
}
iv[2] = 3; //修改元素
showVect(iv);
iv.pop_back(); //删除末尾元素
showVect(iv);
cout << iv.empty() << endl; //判断是否为空
iv.clear(); //清空容器
std::vertor<string> sv;
sv.push_back("hello");
sv.push_back("world");
sv.push_back("c++");
showVect()
return 0;
}
关联