文章目录
一、vector的成员、构造、析构、迭代器的基本实现
下图是vector的基本结构:
#pragma once
#include<iostream>
#include<assert.h>
namespace Myvector{
template<class T>
class vector {
public:
//因为vector的底层是连续的,所以可以使用原生指针来当作迭代器使用
typedef T* iterator;
typedef const T* const_iterator; //const引用const迭代器
iterator begin() {
return _start;
}
iterator end() {
return _finish;
}
const_iterator begin() const{
return _start;
}
const_iterator end() const{
return _finish;
}
//当前vector元素的有效个数
size_t size(){
return _finish - _start;
}
//当前vector容器的个数
size_t capacity() {
return end_of_storage - _start;
}
//构造函数,构造一个空的vector
vector():
_start(nullptr),_finish(nullptr),end_of_storage(nullptr)
{
}
//vector的析构函数
~vector() {
delete[]_start;
_start = _finish = end_of_storage = nullptr;
}
private:
iterator _start;
iterator _finish;
iterator end_of_storage;
}
}
二、check_capacity、reserve方法
check_capacity判断是否达到扩容条件
void check_capacity() {
if (_finish == end_of_storage) {
//当最初的时候,容量为0,要给个初始值
size_t newcapacity = capacity() == 0 ? 1 : 2 * capacity();
reserve(newcapacity);
}
}
reserve实现重新配置、元素移动、释放原空间
void reserve(size_t n) {
if (n > capacity()) {
size_t sz = size(); //保存原有vector的大小
T* tmp = new T[n]; //重新配置新空间
// memcpy(tmp,_start,sizeof(T)*size()); 出现深浅拷贝问题
if(_start)
for(size_t i=0;i<sz;i++){
tmp[i] = _start[i];
}
delete[] _start; //释放原空间
//将vector的指针指向新配置的空间
_start = tmp;
_finish = _start + sz;
end_of_storage