手撕STL容器之vector篇
作者:互联网
vector类
首先明确完成一个最基本的vector类需要实现什么
实现之前应该思考 vector的ADT应该是什么样的
- 指针(用于遍历?)
- 容量
- 数据
- 线性排列
构造函数
默认构造函数
有参构造函数
析构函数
增加元素 :push_back()
删除元素:erase()
厉害完整的能写到 一千多行去,考虑到很多情况(异常...)
目前参考的是一个精简的小实现 github上开源的那个写得太高级,需要时间去消化。
这个版本的思路大致是:
逐步完成
比如说:有参构造函数需要添加元素需要调用push_back()函数,而push_back()函数需要调用insert_after函数(),insert_after()函数是insert_before函数的包装,insert_before需要判断
当前的容量与大小是否相同(即满了没有), 然后就需要用allocator函数分配内存空间,new T[大小] 需要删除 delete[] 地址名。
代码:
//防止重复定义
//#pragma once
/*
#ifndef __ZB_VECTOR_H__
#define __ZB_VECTOR_H__
*/
//依赖的库
#include <iostream>
#include <algorithm>
//#include <assert.h>
using namespace std;
//模板
template <class T>
class zb_vector
{
private:
//容器步进值
#define WORK_LENGTH 64
public:
//构造函数
zb_vector():zb_size(0),zb_capa(0),zb_data(nullptr){}
zb_vector(int n,const T& data):zb_size(0),zb_capa(0),zb_data(nullptr){
cout << " push_back" <<endl;
while(n--)
{
push_back(data);
cout << " push_back" <<endl;
}
}
//析构函数
~zb_vector(){
//#pragma warning
}
void push_back(const T& data){
insert_after(zb_size-1,data);
}
void insert_after(const int pos,const T& data){
insert_before(pos+1,data);
}
void insert_before(const int pos,const T& data){
if(zb_size == zb_capa)
{
T* temp = zb_data;
zb_capa += WORK_LENGTH;
zb_data = zb_allocator(zb_capa);
memcpy(zb_data,temp,zb_size*sizeof(T));
zb_deallocator(temp);
}
for(int i=(int)zb_size++;i>pos;i--)
{
zb_data[i] = zb_data[i-1];
}
zb_data[pos] = data;
//zb_size++;
}
private:
T* zb_allocator(const unsigned int& zb_capa){
return new T[zb_capa];
}
void zb_deallocator(T* arr){
if(arr) delete[] arr;
}
private:
int zb_size;
int zb_capa;
T* zb_data;
};
标签:容器,函数,STL,zb,vector,data,capa,构造函数 来源: https://www.cnblogs.com/black-worrior-2000/p/16514813.html