ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手撕STL容器之vector篇

2022-07-24 17:02:09  阅读:138  来源: 互联网

标签:容器 函数 STL zb vector data capa 构造函数


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有