C++之模板(模板函数+模板类+STL+重载[未完待续])

模板
模板就是把类型当做参数,假设有一下代码
代码1:

int max(int a, int b){ return (a > b) ? a; b; }
char max(char a, char b){ return (a > b) ? a; b; }

上述代码的两个函数逻辑结构相同,但是数据结构不一样,要实现只编写一个函数就能实现所有的这些函数,就要用到模板。
模板的关键字:template typename class(这里的class不是代表类,而是表示数据类型)
所以代码1可以写成如下模式
代码1.1

template <class T>//class用typename代替也可以
T max(T a, T b)//函数模板
{
    return (a > b) ? a; b;
}

int ival = max(100,99);//模板函数
char cval = max<char >('A','B');

用typename的方式如下代码

template<typename T>
void swap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}
int x = 20, y = 30;
swap<int>(x, y);

变量作为模板的参数如下代码所示

tymplate<int size>
void display()
{
    cout<<size<<endl;
}
display<10 >();

多模板参数时方法如下代码所示

template<typename T,typename C>
void display(T a, C b)
{
    cout << a << " " << b << endl;
}

int a=1024;string str="Hello world!";
display<int ,string >(a,str);

对于C++来说,同样也存在着类模板,代码如下所示

template<typename T>
class MyArray
{
public:
    void display();
private:
    T *m_pArr;//数据成员指针
};

//类外定义时大不相同
template<class T>//所有成员函数都要加这一句
void MyArray<T>::display()
{
    ....
}
int mian()
{
    MyArray<int> arr;
    arr.display();
    return 0;
}

同时在这里需要注意的是在目前的开发环境下不能将类模板的声明和实现分开编译,即不能分别写成.h和.cpp文件分开的样式,可以全部写在.h文件下,最后用include调用。

标准模板库(STL)
vector 向量,头文件#include,其实就是数组的封装,下面说一下用法

vector<T> v1;//保存类型为T的对象,默认构造函数v1为空
vector<T> v2(v1);//v2是v1的一个副本
vector<T> v3<n, i>;//v3包含n个值为i的元素
vector<T> v4(n);//v4包含初始化元素的n个副本

empty();//判断是否为空,返回bool类型
begin();//返回向量迭代器的首元素
end();//返回向量迭代器最后一个元素的下一个元素
clear();//清空向量
front();//第一个数据
back();//最后一个数据
size();//数据个数
push_back();//将数据插入向量尾部
pop_back();//删除尾部数据

int main()
{
    vector<int >vec;
    vec.push_back(10);
    vec.pop_back();
    cout << vector.size() << endl;
    return 0;
}

若要删除元素,可以l.erase(begin()+n),为删除第n个元素。

迭代器iterator,通过迭代器我们可以访问对象的每个元素

int main()
{
    vector vec;
    vec.push_back("hello");
    vector<string >::iterator citer=vec.begin();
    for(;citer!=vec.end();citer++){
        cout<<*citer<<endl;
    }
    return 0;
}

链表模板(list)
链表模板的特点是插入速度快,头文件#include,遍历只能用迭代器

list<int>::iterator itor = list.begin();
for (; itor != list.end(); itor++)
{
    cout << *itor << endl;
}

映射模板(map)
映射模板存储的数据都是成对出现的,头文件#include

map<int, string> m;
pair<int, string>p1(10, "SH");//pair定义若干对
pair<int, string>p2(20, "BJ");
m.insert(p1);
m.insert(p2);
cout << m[10] << endl;
cout << m[20] << endl;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Rocky0429

一块也是爱

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

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

打赏作者

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

抵扣说明:

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

余额充值