stl结构体模板

上一篇文章我们提到了c++结构体模板的经典应用pair模板,发现功能异常强大,想必我们的小伙伴肯定已经为c++模板的奥秘所深深吸引,(哈哈!!假装有人在看,心酸大哭

讲c++结构体模板之前,现在我们默认我们同学已经对c++函数模板,类模板有所了解了,恩!!还是上图讲一下吧

那c++模板类型主要有3种

1.函数模板

//函数模板---使用体现:调用函数时传递的参数类型。
template<class 数据类型参数标识符> <返回类型><函数名>(参数表) {     函数体 }

2.类模板

//类模板---使用体现:声明类对象时 Stack<类型> s;
template<class T>
class Stack
{
 public:
  T pop();
  bool push(T e);
 private:
  StackNode<T> *p;
}
template<class T>//类模板外的 成员函数实现
T Stack<T>::pop()
{...}

3.结构体模板

//结构体模板---使用体现:声明结构元素时 StackNode<类型> s;
template<class T>
struct StackNode
{
  struct T data;
  struct StackNode<T> *next;
};

//示例代码
#include <iostream>
 
//还是熟悉的struct student
struct student{
    int height;
    int weigth;
};
 
template <typename T>
struct Stack{
  int top;
  int size;
  T *data; //将数据类型定义成模板,增强通用性
 
};
 
int main()
{
    //初始化一个student栈
    struct student a;
    struct Stack<struct student>;
   struct Stack(0,-1,&a);   //报错 ----- 原因:下面见分晓
 
 
    return 0;
}


第二发:

    我们发现结构体模板pair<int,int> a(3,4); 

    而在上述代码中,我们定义

 struct Stack(0,-1,&a);  
//---- 报错,原因,在c++中,结构体也有构造函数  structclass没有区别,唯一的区别是,如果没有写publicprivate等,
//struct缺省是公有成员class缺省是私有的

所以说下面代码等价

template <typename T>
struct Stack{
  int top;
  int size;
  T *data;          //将数据类型定义成模板,增强通用性
  Stack(int top, int size)
  {   
 
   this->top = top;
     this->size = size;
  }
};

-----------------------------------------分割线----------------------------------------------------------

template <typename T>
struct Stack{
public:
  int top;
  int size;
  T *data;          //将数据类型定义成模板,增强通用性
  Stack(int top, int size)
  {   
 
   this->top = top;
     this->size = size;

  }
};

而且,假如结构体没有自定义构造函数,c++编译器编译时会自动加入一个无参构造函数,

同样的,在结构体里面也可以使用this指针,this指针在结构里面也就代表着本结构体示例的指针(类的this,本类的对象的指针)

所以说structclass没有区别,唯一的区别是,如果没有写publicprivate等,struct缺省是公有成员,class缺省是私有的,其他的类型

构造函数,析构函数,拷贝构造函数,继承在结构体也可以同样使用

继承

//以下合法

struct Stack2: public Stack{
 
};


结果:

#include <iostream>
 
using namespace std;
//还是熟悉的struct student
struct student{
    int height;
    int weigth;
};
 
template <typename T>
struct Stack{
  int top;
  int size;
  T *data;          //将数据类型定义成模板,增强通用性
  Stack(int top, int size, T *s)
  {
     this->top = top;
     this->size = size;
     data = new(T);
     memcpy(data,s,sizeof(s));
  }
};
 
 
int main()
{
    //初始化一个student栈
    struct student a;
    struct Stack<struct student> s(1,2,&a);
 
    cout<<s.size<<" "<<endl;
 
    return 0;
}

之前我们定义pair的时候

 pair<int,int>a(3,4);  

现如今我们的struct Stack

初始化的时候

 struct Stack<struct student> s(1,2,&a);

是不是一样的效果

有的同学说不是,好,再给你来点狠得

typedef struct Stack pair_test;

定义pair_test<struct student>p(1,2,&a); 




    

    










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值