C++学习笔记day4(模板和stl)

函数模板:
c++另一种编程思想称为泛型编程,主要利用的技术就是模板。
c++提供两种模板机制:函数模板和类模板。
函数模板作用:
建立一个通用函数,函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。
语法:
template<typename T>
函数声明或定义
解释:
template--声明创建模板
typename--表明其后面的符号是一种数据类型,可以用class代替。
T--通用的数据类型,名称可以替换,通常为大写字母。
两种方式使用函数模板:
1.自动类型推导
myswap(a,b)
2.显示指定类型
myswap<int>(a,b)
模板目的是为了提高复用性,将类型参数化。

函数模板注意事项:
1.自动类型推导必须推导出一致的数据类型T才可以使用。
2.模板必须要确定出T的数据类型才可以使用。

普通函数与函数模板的区别:
1.普通函数调用时可以发生自动类型转换(隐式类型转换)
2.函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换。
3.如果利用显示指定类型的方式,可以发生隐式类型转换。
建议使用显示类型指定方式调用函数模板。

普通函数与函数模板的调用规则:
1.如果函数模板和普通函数都可以实现,优先调用普通函数。
2.可以通过空模板参数列表来强制调用函数模板。
3.函数模板也可以发生重载。
4.如果函数模板可以产生更好的匹配,优先调用函数模板。
总结:既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性。

模板的局限性:
数组之间的赋值操作无法实现
自定义数据类型无法正常运行
为解决这些问题,c++提供模板的重载,可以为这些特定的类型提供具体化的模板。
总结:
利用具体化的模板,可以解决自定义类型的通用化。
学习模板并不是为了写模板,而是在stl能够运用系统提供的模板。

类模板:
建立一个通用类,类中的成员数据类型可以不具体确定用一个虚拟的类型来代表。
语法:
template<typename T>

在声明模板后面写类,称为类模板。

类模板和函数模板区别:
1.类模板没有自动类型推导的使用方式
2.类模板在模板参数列表中可以有默认参数

类模板中成员函数调用时机:
普通类中的成员函数一开始就可以创建
类模板中的成员函数在调用时才能创建

类模板对象做函数参数:
类模板实例化出的对象,向函数传参的方式。
一共有三种传入方式:
1.指定传入的类型--直接显示对象的数据类型
2.参数模板化--将对象中的参数变为模板进行传递
3.整个类模板化--将这个对象类型模板化进行传递

类模板与继承:
当类模板碰到继承时,需要注意一下几点:
1.但只对继承的父类是一个类模板时子类在声明的时候要指定出父类中T的类型。
2.如果不指定,编译器无法给子类分配内存。
3.如果想灵活指定出父类中T的类型,子类也需变为类模板。

类模板成员函数类外实现:

类模板的分文件编写:
问题:
类模板中成员函数创建时机是在调用阶段,导致分文件编写是链接不到。
解决方式1:直接包含.cpp文件
解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制。(主要)

类模板与友元:
掌握类模板配合友元函数的类内和类外实现。
全局函数的类内实现:
-直接在类内声明友元即可
全局函数的类外实现:
-需要提前让编译器知道全局函数的存在

STL基本概念:
standard template library,标准模板库
STL从广义上分为:
容器container
算法algorithm
迭代器iterator
容器和算法之间通过迭代器进行无缝衔接
STL几乎所有代码都采用了模板类或者模板函数

STL六大组件:
STL大体分为六大组件:容器,算法,仿函数,迭代器,适配器(配接器),空间配置器

容器:置物之所也
stl容器就是将运用最广泛的一些数据结构实现出来。
常用的数据结构:数组,链表,树,栈,队列,集合,映射表等。
这些容器分为序列式容器和关联式容器两种:
序列式容器:
强调值的排序,序列式容器中的每个元素均有固定的位置。
关联式容器:
二叉树结构,各元素之间没有严格的物理上的顺序关系。

算法:问题之解法也
有限的步骤解决逻辑或数学上的问题,所以门学科我们叫做算法。
算法分为质变算法和非质变算法
质变算法:
是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等。
非质变算法:
是指运算过程中不会更改区间内的元素内容,例如查找,计数,遍历,寻找极值等等。

迭代器:容器和算法直接的粘合剂
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式
每个容器都有自己专属的迭代器
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。
常用容器中,迭代器种类为双向迭代器和随机访问迭代器。

vector存放内置数据类型:
Stl中最常用的容器为vector,可以理解为数组。
包含vector
容器:vector
算法:for_each
迭代器:vector<int>::iterator

vector容器嵌套容器:相当于二维数组

STL常用容器:
string基本概念:
string是c++风格的字符串,而string本质上是一个类。
string和char的区别:
char*是一个指针
string是一个类,内部封装了char*,管理这个字符串,是一个char*的容器。
特点:
string类内部封装了很多成员方法
例如 查找,拷贝,删除,替换,插入。
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。

string构造函数:
构造函数原型:
string();//创建一个空的字符串 例如string str;
string(const char* s)//使用字符串s初始化
string(const string& str)//使用string对象初始化另一个string对象
string(int n,char c)//使用n个字符c初始化

string赋值操作:给string字符串进行赋值

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pei55m9NzY1,size_20,color_FFFFFF,t_70,g_se,x_16


string字符串拼接:
实现在字符串末尾拼接字符串

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pei55m9NzY1,size_20,color_FFFFFF,t_70,g_se,x_16

string查找和替换:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pei55m9NzY1,size_20,color_FFFFFF,t_70,g_se,x_16
string字符串比较:
按字符的ASCII码进行对比
= 返回 0
> 返回 1
< 返回 -1

string字符存取:
对单个字符进行读或写操作。
通过[]或at访问

string插入和删除:
insert和erase
起始下标都是从0开始。

 

(笔记中图片均来自b站C++教程:黑马程序员视频截图)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值