13.vector(上)
顺序表有一个指针,sizecapacity,-a指向一个数组,存什么指针指向内容就是什么,
vector 的vector 在这个地方初始化可以调用它的resize也可以构造的时候就给可以用n个value初始化,,,十行五列,编译器在这实例化两个vector,底层:
模版的原理就是让我们的事情给编译器去干。vecor<vector>实际实例化了两个类一个是vector<int>,一个是int
template<class T>
class vector
{T& operator[](int i){assert(i < _size);return _a[i];}
private:T* _a;size_t _size;size_t _capacity;
};vector<int>
class vector
{int& operator[](int i){assert(i < _size);return _a[i];}
private:int* _a;size_t _size;size_t _capacity;
};// vector<vector<int>>
class vector
{vector<int>& operator[](int i){assert(i < _size);return _a[i];}
private:vector<int>* _a;size_t _size;size_t _capacity;
};vector<<>>本质是两个【】的调用,第一个【】的调用vector<int>的【】,返回一个vector<int> 对象,第二层再调用int 的operator【】,这时候相当于数组的第一个数据。此时返回值是int ,都是用引用返回都可以修改。
这里vector vector 就像二维数组一样,实际是两个函数调用,
这两句代码是等价的
这里数组可以随便开,而静态是定常的,这是最大的区别。
C:
free也很麻烦,还是vectorvector好用
返回二维数组长度(行)int*外面可以拿到,但是每一行数据个数可能不一样,返回每一行的长度需要一维数组来存,实参指针传给形参拿不到,所以传地址,就是二级指针
C++返回vector 的vector 不需要返回了,size 里面都有记录了,
这每一行数据个数是变化的,
就是vector <int>,就是调用vector<int>默认构造函数去初始化,,就是我初始化了但是里面一个值也没有
back,front返回的也都是引用



再改值

也可以直接resize改成1
vector底层:右键转到定义就跳到vector的源代码了
看源代码不用一行一行看 一行一行看看不懂比如vector包含内存池,需要alloc,vector猜在vector。h中,然后确认

一看vector类都在里面,就是了,上来看细节,就崩溃了。
vector不是capacity size 这是四个迭代器,往上找
迭代器在这,是value type* 是T,喜欢搞很多typedef,不要再看typedef是什么,不要看,看框架,需要那个细节看那,
猜猜这三个指针,开始 结束 capacity 相关。
看一下,看一下构造函数,初始化是什么样,
平时用vector 定义的是空的,开始pushback ,很多接口,看一下核心接口,捋一下类关系,最好画图,框架就清楚了,再看细节,扩容怎么阔这些,


先不看construct这些细节,(内存池只开了空间,没有初始化,这个construct就是)
看一下这个文件,

空间是从内存池来的,初始化不能直接赋值 比如说 finish是个string,没有初始化,未初始化空间初始化,就要调用构造函数就要调用定位new,显示调用构造函数,这是细节。
如果满了调用insert-aux,就是pos之前插入,
没有满就往后挪动数据,如果满了就扩容,
在这可以看一下size是怎么
根据这块就可以完全确认逻辑了,size是finish-start,左闭右开一减就是个数,
逻辑和猜的一样,这只是看一下工作干的,不用明白。
