邢台做移动网站多少钱,磐安县建设局网站,诸城市建设局网站,网站暂停怎么做引言#xff1a;
北京时间#xff1a;2023/2/27/11:42#xff0c;高数考试还在进行中#xff0c;我充分意识到了学校的不高级#xff0c;因为题目真的没什么意思#xff0c;虽然挺平易近人#xff0c;但是……#xff0c;考试期间时间比较放松#xff0c;所以不能耽误…引言
北京时间2023/2/27/11:42高数考试还在进行中我充分意识到了学校的不高级因为题目真的没什么意思虽然挺平易近人但是……考试期间时间比较放松所以不能耽误我更新博客自从上篇博客我们把string类的基本知识学习完之后今天我们的主要目标就是学习一下什么是vector 复习模板从模板开始学习vector
首先vector是什么 在C中vector是一个类是一个类似于string类的类并且它们都是一个模板类区别于string类vector是一个可以管理任意数组的数组只要数据类型合适但string类是一个只针对于字符串数组的字符串类所以本质上vector就是用一个动态增长的数组实现的模板类。
认识了vector是什么现在我们可以知道它就是一个动态数组并且它可以通过类模板的形式来管理不同的数据类型所以我们意识到类模板和vector是有一定的联系的此时我们就需要类从模板的知识入手以浅入深学习STL中的vector容器。
类模板
定义模板形式
templateclass T这个代码就可以实现函数模板和类模板定义此时无论是函数中还是类中都可以通过替换 尖括号中的类型来替换整个函数或者整个类中的数据类型以方便于给所有的类型的数据使用如下图 此时就可以如上图main函数中通过在尖括号 中使用不同的数据类型实现对Stack整个类使用不同的数据类型进而实现泛型编程充分使用类模板。
所以可以看出我们的STL中的vector类就是通过类模板的形式实现的一个可以针对所有数据类型的动态数组。
总vector类区别于string类的本质原因就是vector类通过类模板的形式实现可以针对所有数据类型的动态数组
vector的学习
了解了什么是类模板什么是vector的本质此时正式开始学习vector首先还是那句话vector类和string类本质上是没有什么区别的最大的区别就是数据类型的不同所以此时我们学习vector类的过程中本质上还是在学习string类又因为我们上篇博客已经学习了什么是string类此时学习vector类时我们就会变得更加的轻松并且使用vector类会变得更加的方便。 懂的上述我们知道学习vector还是在吃旧饭所以我们按照以前的方式来进行学习就行了首先第一步打开C官网寻找vector的具体说明和各种成员函数在vector的首页我们就可以看到上图的内容vector和我们所说的一样是一个类模板并且此时还使用了一个新的概念空间配置器内存池的概念目的就是为了可以提高数组申请空间方面的效率 注空间配置器是 STL 源码中实现的一个小灶用来应对 STL 容器频繁申请小块内存空间的问题。 他算是一个小型的内存池 以提升STL 容器在空间申请方面的效率 下面我们就围绕着vector类的一些常用的接口来深入了解一下vector的具体实现
首先是vector类中的构造函数 如下图就是一个简单的vector类的使用
其中使用了vector类中的尾插push_back、迭代器iterator、方括号加下标([]和拷贝构造函数copy
注头文件 #includevector
了解了vector类的基本使用此时我们就来看一看它构造函数中的 fill 的使用初始化对象往数组中填充数据和迭代器区间range的使用
迭代器区间
并且此时我们发现该迭代器的类型不是以前我们所见的 iterator 而是 inputiterator此时 inputiterator 代表的就是一个可以接收任意容器的迭代器区间不单单只是vector容器也可以是别的容器例string类前提是数据类型可以匹配上并且此时我们了解到迭代器是有非常多的种类的具体可以参考该链接迭代器种类和使用
如下图证明我们的vector迭代器是可以接收任意容器的迭代器区间的因为vector类中的迭代器是使用 inputiterator 类型的迭代器
并且因为此时我们使用的是一个迭代器区间所以我们可以规定迭代器的开始位置和结束位置通过begin()和end()来控制注此时char类型转化为int类型本质上是类型转换然后通过ASCII码值来进行打印如下图
逆向迭代器
搞定了上述迭代器区间的使用此时我们来看一看以前了解过的逆向迭代器的使用如下图 所以我们可以发现虽然范围for用起来非常的方便但是并不可以支持逆向遍历并且本质上范围for使用的是迭代器所以本质上迭代器才是王者并且以后我们遇到别的数据类型例如树状结构或者链表这些遍历都是使用迭代器进行的。
开空间函数reserve和resize
reserve 搞定了vector类中的构造函数此时我们看一看vector中别的函数如reserve函数提前开空间函数如下图 该图充分展示了开空间函数reserve的使用。
resize 了解vector类中的resize函数我们通过一个题目来搞定它 题目给定一个非负整数生成杨辉三角的前numRows行在杨辉三角中每个数是它左上方的数的和 class Solution1
{
public:vectorvectorint generate(int numRows)//此时就是一个类中类的使用例vectorint中代表的是该vector中的每个 数据是int而vectorvectorint代表的是该vector中的数据是vectorint而已{//本质可以理解成一个二维数组一个vector数组指向了一个一个的vector的意思vectorvectorint vv;//此时是可以直接在这里使用类里面的构造函数进行初始化的但是为了控制类中的数据我们只能使用resizevv.resize(numRows, vectorint());//此时这样写的意思就是开辟numRows行然后给一个匿名对象vectorint去初始化这些行,当然不使用匿名对象也可以使用vectorint v;进行for (size_t i 0; i vv.size(); i)//无论是上面的那个()的意思还是下面这个()的意思本质上都是为了取调用函数获得一个返回值{vv[i].resize(i 1, 0);//和上面那句是一样的开空间然后用0去初始化并且此时刚好符合题意第一行一个数据第二行两个数据第三行三个数据充分体现出for循环的好处vv[i][0] vv[i][vv[i].size() - 1] 1;//此时就是根据杨辉三角的特性把每一行的第一个数据和最后一个数据给成1}//此时vv[i].size(),其实本质上还是vectorint类不是int类所以此时表示的是第几个vectorint然后把该类的大小减1给给它for (size_t i 0; i vv.size(); i){for (size_t j 0; j vv[i].size(); i)//vv[i].size()代表的就是vectorint类中的那个vector数组的大小{if (vv[i][j] 0){vv[i][j] vv[i - 1][j] vv[i - 1][j - 1];//这句代码就是经典的杨辉三角代码上一行本列的数据上一行上一列的数据}}}return vv;}
};从上题中我们可以看出resize函数在vector中也具备开空间和初始化的作用并且从上述代码和注释中我们可以看出vectorvector int 是可以当作一个指定空间大小的二维数组使用的只不过此时vector类中不是int而是一个vector int 一个类中类并且该类内存的类是一个int类型的类。本质上还是模板的作用只是此时vector类模板的数据类型改变了而已如下图 总而言之就是模板的数据类型不同而已 总结考试中没什么状态写让我摆烂一个一个星期吧