其他分享
首页 > 其他分享> > 手撕STL容器之vector篇

手撕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