一、模板函数(compare)
模板函数
/函数模板 template是关键字
2 //class 和 typename一样的
3 //T 系统自动推导 或 用户指定
4 template<typename T>
5 void mySwap(T &a,T &b)
6 {
7 T tmp;
8 tmp = a;
9 a = b;
10 b = tmp;
11 }
12 void test02()
13 {
14 int data1 = 10,data2=20;
15 cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;
16 mySwap(data1,data2);//自动推导出T为int
17 cout<<"data1 = "<<data1<<", data2 = "<<data2<<endl;
18
19
20 char data3 = 'a',data4='b';
21 cout<<"data3 = "<<data3<<", data4 = "<<data4<<endl;
22 mySwap(data3,data4);//自动推导出T为char
23 cout<<"data3 = "<<data3<<", data4 = "<<data4<<endl;
24 }
25 int main(int argc, char *argv[])
26 {
27 test02();
28 return 0;
29 }
特化模板函数
类模板
#include <iostream>
2 #include<string>
3 using namespace std;
4 //类模板
5 template<class T1, class T2>
6 class Data
7 {
8 private:
9 T1 name;
10 T2 num;
11 public:
12 Data(T1 name, T2 num)
13 {
14 this‐>name = name;
15 this‐>num = num;
16 cout<<"有参构造"<<endl;
17 }
18 ~Data()
19 {
20 cout<<"析构函数"<<endl;
21 }
22 void showData(void)
23 {
24 cout<<"name="<<this‐>name<<", num="<<this‐>num<<endl;
25 }
26 };
27
28 void test01()
29 {
30 //Data ob1("德玛西亚",100);//err 类模板不允许 自动推导
31 Data<string,int> ob1("德玛西亚",100);
32 ob1.showData();
33
34 Data<int,string> ob2(200, "提莫");
35 ob2.showData();
36
37 Data<int,int> ob3(100,200);
38 ob3.showData();
39
40 Data<string,string> ob4("小炮","德玛");
41 ob4.showData();
42 }
43 int main(int argc, char *argv[])
44 {
45 test01();
46 return 0;
47 }
48
二、模板类Queue或Stack
Queue
模板类(Queue,Stack)
(Queue)队列容器:先进先出 队尾插入数据 对头删除数据
queue容器:没有迭代器 不具备遍历功能 只能通过front、back访问
**
queue构造函数
queue queT;//queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数
queue存取、插入和删除操作
push(elem);//往队尾添加元素
pop();//从队头移除第一个元素
back();//返回最后一个元素
front();//返回第一个元素
queue赋值操作
queue& operator=(const queue &que);//重载等号操作符
queue大小操作
empty();//判断队列是否为空
size();//返回队列的大小**
Stack
先进后出的数据结构。
push入栈、pop出栈、top永远指向栈顶元素
stack没有迭代器
stack构造函数
stack stkT;//stack采用模板类实现, stack对象的默认构造形式:
stack(const stack &stk);//拷贝构造函数
stack赋值操作
stack& operator=(const stack &stk);//重载等号操作符
stack数据存取操作
push(elem);//向栈顶添加元素
pop();//从栈顶移除第一个元素
top();//返回栈顶元素
stack大小操作
empty();//判断堆栈是否为空
size();//返回堆栈的大小
#include <iostream>
#include <stack>
using namespace std;
void test01()
{
stack<int> s;
//入栈
s.push(10);
s.push(20);
s.push(30);
s.push(40);
if(s.empty())
{
cout<<"栈容器为空"<<endl;
}
else
{
cout<<"栈容器非空"<<endl;
cout<<"size = "<<s.size()<<endl;
}
while(!s.empty())//非空 返回false
{
cout<<s.top()<<endl;
//出栈
s.pop();
}
}
#include<queue>
void test02()
{
queue<int> q;
q.push(10);
q.push(20);
q.push(30);
q.push(40);
if(q.empty())
{
cout<<"容器为空"<<endl;
}
else
{
cout<<"容器非空"<<endl;
cout<<"size = "<<q.size()<<endl;
cout<<"对头元素 = "<<q.front()<<endl;//10
cout<<"队尾元素 = "<<q.back()<<endl;//40
}
cout<<"遍历队列"<<endl;
while(!q.empty())
{
cout<<q.front()<<" ";
q.pop();//出队
}
}
int main(int argc, char *argv[])
{
test02();
return 0;
}
运行结果:
三、->、* 等运算符重载
1 #include <iostream>
2
3 using namespace std;
4 class Person
5 {
6 private:
7 int num;
8 public:
9 Person(int num):num(num)
10 {
11 //this‐>num = num;
12 cout<<"有参构造num = "<<num<<endl;
13 }
14
15 void showPerson(void)
16 {
17 cout<<"num = "<<num<<endl;
18 }
19 ~Person()
20 {
21 cout<<"析构函数 num = "<<num<<endl;
22 }
23 };
24
25 //设计一个智能指针 解决 Person new出的堆区空间 释放问题
26 class SmartPointer{
27 public:
28 Person *pPerson;
29 public:
30 SmartPointer(Person *p)
31 {
32 pPerson = p;
33 }
34
35 ~SmartPointer()
36 {
37 if(pPerson != NULL)
38 {
39 delete pPerson;
40 pPerson = NULL;
41 }
42 }
43
44 //成员函数重载‐>运算符
45 Person* operator‐>()
46 {
47 return this‐>pPerson;
48 }
49
50 //成员函数 重载 *运算
51 Person& operator*()
52 {
53 return *(this‐>pPerson);
54 }
55 };
56 void test01()
57 {
58 Person *p = new Person(100);
59 p‐>showPerson();
60
61 //假如我忘了 delete p
62 //delete p;
63
64 //需求:自动的帮我释放 堆区空间(智能指针的概念)
65 SmartPointer pointer(new Person(200));
66
67 //访问Person类中的showPerson()
68 //pointer.pPerson‐>showPerson();
69
70 //保证指针的使用
71 //(pointer.operator ‐>())‐>showPerson();
72 pointer‐>showPerson();
73 (*pointer).showPerson();
74
75 }
76 int main(int argc, char *argv[])
77 {
78 test01();
79 return 0;
80 }