05模板

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;
}

关联

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值