C++ 模板 实验3

一、模板函数(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 }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大只因bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值