vector 认识及使用
vector其实就是我们熟悉的顺序表 和string一样在std标准库中被作为一个类名 其实是类模版名 写成类模版 为了存各个各样的数据 里面的大致结构可以理解为以下(不是真的是这样 先这样理解方便使用)
在使用上类似于之前的string 不过这里的vector是类模版 在创建对象的时候还要显示实例化
如下图 aabb 和cc dd分别会实例化出三个不同的类 一个是存int 一个存float 一个存double
通过实例化出的类再调用他们的构造函数进行了初始化
如下 传迭代器的方式进行初始化
如下 打印也和string一样 有三种方式 下标访问 迭代器 范围for
在扩容上vs采取1.5倍的扩容方式 初始化0 第一次为1 之后*1.5然后四舍五入的方式
同样使用reserve之后就不需要频繁地扩容了
resize使用也和string一样 resize的值小于size时候多出的数直接去掉capacity不变
大于size小于capacity的时候 如果第二个参数没有值默认0来填充 显示写了 用写的值填充
大于capacity会进行扩容并填充
这里的insert 选择插入的位置时候不能用下标来选择了 只能用迭代器
也可以用下标的方式来对里面的数据进行改变 如果要用范围for的的方式改变数据 这里要用引用的方式 用范围for打印的时候 如果是内置类型用不用引用区别不大 但是如果是自定义类型的话这里还需要拷贝 就需要很大的额外空间了 就有必要用引用
之前的string我们自己也写过其底层的一些功能了 我们知道string其实也是顺序表 这里的vector就是顺序表的类模版 这里用char来显示实例化那这不就是个存储着char类型的顺序表了吗 那为什么还要有string呢
string类型的变量 在末尾是有\0 的 而vector实例化的存储char类型在最后没有\0
string有了\0且有_str(转换成c风格的字符串) 所以string类型可以很好的兼容c语言而vector实例化的存储char类型的不可以
同时 对于字符串来说很常用的substr返回子串等功能 在vector实例化出的存储char类型的里面没有这些功能
在string中之前看过为了兼容c风格的字符串每个函数的功能都重载了很多个 而对vector而言很多的功能都是直接用到迭代器的 不能兼容c风格的字符串
vector不仅仅只能存储一些简单的的内置类型 自定义类型 string类型 或者是vector<int>这样子都可以进行存储
如下 存储着string类型 可以直接尾插string类型 也可以直接尾插字符串(这里的字符串隐式转换为了string类型)
用vector<vector<int>> 这种方式来创建就类似于二维数组了
xx相当于下图的第一个里面存着10个int类型的值
ve相当于下图的第二个里面存着10个vector<int>类型的值 里面的每一个对象相当于一个上面的全部 里面的每一个都存在10个int类型的值
要改变里面的值就需要用两层[]来访问 打印的时候 用范围for位置下标打印也需要两层
知道这些后 我们就可以用这些来完成杨辉三角的题目
代码如下
先创建一个vector<vector<int>>类型的对象ss 用numRows个vector<int>进行初始化 这里没有传第二个参数 相当于每一个vector<int> 类型的对象都进行了默认的构造函数进行初始化 然后第一层for循环让每一层都保留i个数 没有的用1来填充 这样就相当于每一行的首位都初始化为了1
然后后面两层嵌套for循环让从三层到最后一层除了首尾位置的值为上一层同一个位置和上一层的前一个位置的和
class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ss(numRows);for(int i=0;i<numRows;i++){ss[i].resize(i+1,1);}for(int j=2;j<numRows;j++){for(int k=1;k<j;k++){ss[j][k]=ss[j-1][k]+ss[j-1][k-1];}}return ss;}
};
其实vector里面不是最开始那样和string一样 一个指针指向起始位置 一个size 一个capacity
实际上是三个指针 如下 start指向第一个位置 finish指向最后一个元素的后一个位置 end_of_storage指向能存储个数的后一个位置