自定义vector容器【未完待续】

C++实现自定义vector以及allocator 实现vector前言初步实现出现的问题解决问题Allocator(空间配置器)最终结果对比系统自带的 前言 不知道大家有没有这种感觉,学习了一段时间后,总想着自己能够实现一些标准库里已经提供的东西,比如说STL容器vector、比如数据类型string。 一方面是对这个知识可以有进一步的一个认识和了解,另一方面也可以检验自己的掌握程度。 基于此,我们今天实现自定义的vector。 初步实现 通过包含头文件#include <vector>转到文档,我们可以查看系统自带vector的实现: 主要 阅读详情
#ifndef REDEFINE_VECTOR_H_
#define REDEFINE_VECTOR_H_
#include"stdafx.h"
#include<memory>
#include<cstring>
#include<fstream>
#include<cstdlib>
template<typename  T,typename allocator=std::allocator<T> >
class vector
{
//public:
//	typedef T value_type;
//	typedef value_type* pointer;
//	typedef const value_type const_pointer;
//	typedef value_type& reference;
//	typedef const value_type& const_reference ;
//	typedef std::size_t size_type;
//	typedef std::ptrdiff diff_type;
public:
	vector();
	vector( int num );
	vector(  resize(int num) );
	vector(T* start, T* end );
	
	void assign(int count, T value );
	void assign(T* start, T*  end );
	
	T& at(int  Pos);
	const T&  at(int  Pos) const;

	const T&   back( )const;
	T& back();

	int capcity()const;
	void clear();
	bool empty()const;

	T* begin();
	T* end();
	
	const T& front()const;
	T& front();

	void insert( T* pos, const T value );
	void insert( T* pos, int count, const T value );
	void insert( T* sour, T* first, T* last );

	void pop_back( );
	void push_back(const T value );

	void erase( T* pos );
	void erase( T* first , T* last );

	~vector();

private:
	static std::allocator<T>elem;
	T* head;
	T* curr;
	T* tail;
	void unload_handle( );// 转储
	const unsigned int resize( int num )const
	{ return  num; }
	void realloc_max(int size );
	void realloc_min( int size );
	void reallocate();
};
#endif


////////////////////实现文件//////////////////


#include"stdafx.h"
#include"redefine_vector.h"
template<T>vector::vector<T>()
	{	
			T* head=elem.allocate(5);
			T* curr=head;
			T* tail=head+5;
			uninitialized_fill( head, tail, T() );
	}
template<T>vector::vector( int num )
	{
		T* head=elem.allocate(num);
		T* curr=head;
		T* tail=head+num;
		uninitialized_fill( head, tail, T() );
	}
template<T>vector::vector(  resize(int num) )
	{
		std::ptrdiff size=tail-head;
		if ( num>size )
			try
				{	
					realloc_max(num);
				}
		if ( num<size )
			try
				{
					realloc_min(num);
				}
	}
template<T>vector::vector(T* start, T* end )
	{
		std::ptrdiff sur_dis=end-start;
		std::ptrdiff des_dis=tail-head;
		if ( sur_dis>des_dis )
			reallocate();
		for ( T* p=curr; p!=head; )
			elem.destory( --p );
		if ( head )
			elem.deallocate( head, tail-head );
		for (T* tmp=start; tmp<=end; tmp++ )
		{
			elem.construct( curr, *tmp);
			++curr;
		}
	}
template<T> void vector::assign(int count, T value )
	{
		if ( count<=(tail-head) )
		{
			for ( T* p=curr; p!=head; )
				elem.destory( --p );
			if ( head )
				elem.deallocate( head, tail-head );
			uninitialized_fill( head, head+count, value );
		}
		else
		{
			realloc_max( count+20 );
			uninitialized_fill_n( head, head+10 , value, count );
		}
	}
template<T> void vector:: assign(T* start, T*  end )
	{
		std::ptrdiff count=end-start;
		if ( (end-start)<(tail-head) )
		{
			for ( T* p=curr; p!=head; )
				elem.destory( --p );
			if ( head )
				elem.deallocate( head, tail-head );
			memcpy( head, start, count );//c_memcpy(to ,from, count )
		}
		if ( (end-start) > (tail-head) )
		{
			realloc_max( count+20 );
			memcpy( head, start, count );
		}
	}
template<T> T& vector:: at(int  Pos)
{
	curr=head+pos;
	return  *curr;

}
template<T>const T& vector:: at(int  Pos) const
{
	static T* ins_pos=head;
	for ( ; ins_pos!=head+pos; ++ins_pos )
		;
	return *( ins_pos+1);
}
template<T> const T&  vector::  back( )const
{
	return *curr;
}
template<T> T& vector:: back()
{
	return *curr;
}
template<T> int vector:: capcity()const
{
	return ( tail-curr );
}
template<T> void  vector:: clear()
{
		for ( T* p=curr; p!=head; )
			elem.destory( --p );
}
template<T> bool  vector:: empty()const
 {
	 return ( (curr-head)==0 );
 }
template<T> T* vector::  begin()
	{
		return head;
	}
template<T> T* vector::  end()
	{
		return tail;
	}
template<T>const T&  vector:: front()const
	{
		if ( head )
			return *head;
	}
template<T> T& vector:: front()
	{
		if (head )
			return *head;
	}
template<T> void vector::  insert( T* pos, const T value ) //  越界异常
	{
		std::ptrdiff size=tail-head;
		std::ptrdiff dis=pos-head;
		if ( pos>tail )
		{
			cerr<<"Out of range \n ";
			exit(EXIT_FAILURE);
		}
		else
		{
			memmove(head+dis+1, head+dis, 1 )
			for ( T* ins_pos=head; ins_pos<=head+dis; ++ins_pos )
				;
			elem.construct( ins_pos, value );
		}
	}
template<T> void vector::  insert( T* pos, int count, const T value )//越界异常
	{
		std::ptrdiff  size=tail-head
		std::ptrdiff dis=pos-head;
		if ( dis>size )
		{
			cerr<<"Out of range \n ";
			exit(EXIT_FAILURE);
		}
		else
		{
			memmove(head+dis+count, head+dis , count );
			for ( T* ins_pos=head; ins_pos<=head+dis; ++ins_pos )
				;
			for ( int vc=0; vc<=count; ++vc )
				elem.construct( ins_pos, value );
			++ins_pos;
		}
	}
template<T>void vector:: insert( T* sour, T* first, T* last )// 越界异常
{
	std::ptrdiff sur_dis=last-first;
	std::ptrdiff des_dis=tail-head;
	if ( sur_dis<des_dis )
	{
		memmove( sour+sur_dis, sour, sur_dis );
		for ( T* ins_pos=head; ins_pos<=sour; ++ins_pos )
			;
		for ( T* ins_value=first; ins_value<=last; ++ins_value )
			elem.construct( ins_pos, *ins_value );
		++ins_pos;
	}
	else
	{
		cerr<<"Out of range \n ";
		exit( EXIT_FAILURE);
	}
}
template<T> void vector:: pop_back( )
	{
		if ( emepty() )
		{
			cerr<<"vector is empty \n ";
			return ;
		}
		else
		{
				T* pos=curr;
				cout<<*pos;
				curr--;
				elem.destory( pos );
		}
	}
template<T>void  vector:: push_back(const T value )
	{
		if ( curr=tail )
			re_allocate( ) ;
		elem.construct( curr, value );
		++curr;
	}
template<T> void vector:: reserve( int count )
	{
		realloc_max( count );
	}

template<T>void vector:: erase( T* pos )
		{
		std::ptrdiff position=pos-head;
		if ( head+position ==0 )
			
		{
			cerr<<"None elements exits "<<endl;
			exit(EXIT_FAILURE);
		}
		else
		{
			memmove( pos, pos+1, 1);
		}
	}
template<T>void vector::erase( T* first , T* last )//越界异常
{
	if ( first>=head && last<=tail )
	{
		std::ptrdiff size=last-first;
		std::ptrdiff start_dis=first-head;
		std::ptrdiff end_dis=last-head;
		memmove( head+start_dis, head+end_dis, size );
	}
	else
	{
		cerr<<"Out of range \n ";
		exit(EXIT_FAILURE);
	}
}
template<T> vector::~vector()
	{
		unload_hand();
		if ( head!=tail )
		{
			for ( T*  p=curr; p!=head; )
				elem.destory( --p );
			deallocate( head, tail-head );
		}
	}
/////////////private member/////////////////
template<typename T >
void vector<T>::unload_handle()
{
	ofstream put( "temp.txt", ios::out | ios:: app );
	if ( put.is_open()==false )
	{
		cerr<<"open file failed \n ";
		exit(EXIT_FAILURE);
	}
	else
	{
		while (; curr!=head ; )
		put<<*curr--;
	}
	put.clear();
	put.close();
} 
template<T>void vector<T>::realloc_max( int size )
{
		std::ptrdiff dis=curr-head;
		T*  new_mem= elem.allocate( size );
		uninitialized_copy( head, curr, new_mem );
		for ( T* p=curr; p!=head; )
			elem.destory( --p );
		if ( head )
			elem.deallocate(head, tail-head );
		head=new_men;
		curr=head+dis;
		tail=head+size;
}
template<T>void vector<T>::realloc_min( int size )
{
	T* new_mem=elem.allocate(size);
	uninitialized_copy( head, head+size, new_mem );
	for ( T* p=curr; p!=head; )
			elem.destory( --p );
	if ( head )
			elem.deallocate(head, tail-head );
	head=new_mem;
	curr=head+size;
	tail=head+size;
}
template<T> void vector<T>:: reallocate( )
{
	std::ptrdiff size=curr-head;
	std::ptrdiff new_size=2*size;
	T* new_mem=elem.allocate( new_size )
		uninitialized_copy( head, curr, new_mem );
	for ( T* p=curr ; p!=head;  )
		elem.destory( --p );
	if ( head );
	elem.deallocate( head, tail-head );
	head=new_men;
	curr=head+size;
	tail=head+new_size;
}
catch(std:: bad_alloc& error )
	{
		unload_hand();
		cerr<<"memory allocate error  "<<error.what()<<endl;
		throw;
	}
catch(...){ }

保姆级教程:手把手教你用RKISP TURN为RV1106生成和配置IQfile(附AIQ版本匹配避坑指南) 本文提供RV1106 ISP调试的完整指南,详细讲解如何使用RKISP TURN工具生成和配置IQfile,包括环境搭建、参数调试、设备树配置及常见问题解决方案。特别强调AIQ版本匹配的重要性,帮助开发者避免常见陷阱,提升图像信号处理效率。 阅读详情

相关推荐

私彩视频开奖动画直播源码内部核心技术解析及修改可增加后台操控-持续更新文章!

其实在此很感谢能做出H5开奖系统的码农们,而我本人也喜欢分解此类的东西。 因为特殊原因,该东西本人就不做图片展示,以防他人商业化。 借用开奖摇奖代码首先分解首页index文件。代码如下:(后面持续在原有的作品上添加后台操作) 代码里写的//.....是我的注明代码的所需。 ​ &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;...

yugua3837的博客 5995

vector容器

1.vector的遍历操作 vector中也可以存放自定义的数据类型,比如一个类 vector<int> v; //创建一个容器(理解为数组) v.push_back(10); //尾插法向容器中插入一个元素 v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50); 第一种遍历方式: //迭代器可以理解为指针 // vector<

qq_44194231的博客 736

Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板)

本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。

weixin_28487433的博客 390

自定义一个vector向量类

C++标准模板库STL给出了vector,list,deque,stack,set,map等模板类,平时我们直接使用居多,对于类内部怎么实现不在意。现在以向量类vector为例,简单自定义: 其UML: vetor -数组名ele:T -数组目前大小size:int -数组容量cap:int +vector();//用指定元素类型创建一个空向量 +sure():void//当增加元素

yanerhao的专栏 7535

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8724

Abel逆变换及其求解方法

Abel逆变换常应用在轴对称的、光学薄的火焰、羽流或等离子体重建。

weixin_49783507的博客 8370

C++ 简析容器Vector

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 一、基本概念向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能...

GuoBen_的博客 1774

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1111

C++(21)——vector及实现自定义vector以及allocator和iterator

简介 作用:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 vector是表示可以改变大小的数组的序列容器。 与数组一样,vector对元素使用连续的存储位置,这意味也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样高效。 但是与数组不同,它们的大小可以动态变化,容器会自动处理它们的存储。 在内部,vector 使用个动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增大大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言

qq_44824574的博客 4200

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

ITIL 4 讲解:服务目录

最近一直比较忙,没有时间写文章了。今天有空,写写服务目录。 在最近的项目中,服务目录是比较热的话题。金融行业大部分银行、证券、金融公司都实行ITIL流程管理有些年头了,ITIL中最基础的服务请求、事件、问题和变更都已经实施完毕,目前客户在运维领域做的项目大部分都要求整理服务目录,实行服务级别管理。 服务目录介绍 首先解释一下什么是服务目录。服务目录在ITIL 4的定义是:有关服务提供商的所有服务和服务产品的结构化信息,与特定目标受众相关。这个解释有些晦涩难懂,简单来说就是提供给业务用户的服务项,就像饭

雅子MM的专栏 6467

vector容器 常用函数

C++ vector容器,常用函数介绍

xiaojinger_123的博客 1万+

电子电器架构 -- 汽车零部件DV试验与PV试验的定义及关键差异

电子电器架构 -- 汽车零部件DV试验与PV试验的定义及关键差异

Soly_kun的博客 733

详解vector容器

介绍vector,详解各主要接口的使用,OJ的运用,模拟实现

关注学习C++领域,感谢陪伴,共同进步! 1755

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

STL常用容器—vector容器

整理归纳C++ STL的vector容器,主要包括对容器的增删改查操作,vector作为最常用的容器之一,需重点把握

weixin_46216674的博客 1128

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++ Vector容器

数组array,一旦配置了就不能改变。如果要改变空间大小,就需要重新定义一个数组,将旧数据搬到新空间中,并释放原来的空间。vector是一个封装了动态大小数组的顺序容器(单端数组,向量),能够存放各种类型的对象。与普通数组不同,vector可以动态地增长和缩小,以适应程序的需求。vector具有连续存储的特点,这意味着它的元素在内存中是连续存储的,使得访问元素非常快速。为了使用vector,需要包含头文件v.begin();//获取容器的其实迭代器(指向第0个元素)v.end();

weixin_44601183的博客 1278

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【C++篇】Vector容器 Vector嵌套容器

it!= v.end();it++)cout

小吉妙妙屋 2531

vector容器简介(一篇文章让你彻底认识vector容器)

vector容器是一个类似于单边数组的容器,他可以存放自定义数据类型和内置数据类型,它的书写方式为vector 容器名称 例如我们存储int数据就是vector v1;可以实现随机访问容器中的元素,他的扩展方式是动态扩展,即当容器空间满了之后,它会寻找新空间并将原先数据拷贝到新空间再释放旧的空间。它可以通过尾插法和尾删法来添加删除元素也可以通过insert来插入元素,它有四个迭代器可以让我们访问容器中的元素,其中v.begin()和v.end(),分别指向容器中的第一个元素和最后一个元

m0_57094953的博客 2185

C++进阶——vector容器

本人为C++小白,初次接触STL,本篇内容为学习c++时的一些笔记,方便以后复习使用,有错误以及不足之处还请各位大佬们指正。

2301_81677069的博客 1816

C++中自定义vector容器

/static_cast<size_t>(-1) 表示 size_t 类型能存储的最大值(因为 size_t 是无符号类型,-1 会被转换为该类型的最大值)。while (m_size + num >= m_capacity)//超过容量扩展。while (m_size+num >= m_capacity)//超过容量扩展。

2301_76273768的博客 766

vector容器详解

vector数据结构和数组非常相似,也称为单端数组。vector可以说是一个动态数组,它可以存储任何类型的数据,包括类! vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展** 动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间 vector容器的迭代器是支持随机访问的迭代器 使用vector需包含头文件#include< vector > 1. ...

Worthwhile_DUT的博客 4791

STL——array和vector容器

STL——array和vector容器详解

热爱编程的小K的博客 2304

C++ vector初学 vector 存放内置数据类型 存放自定义数据类型 存放自定义数据类型指针 Vector 容器嵌套容器

vector 存放内置数据类型 #include<iostream> using namespace std; #include<vector> #include<algorithm>//标准算法头文件 //vector 容器存放内置数据类型 void test01(){ //创建了一个vector容器,数组 vector<int> v; //向容器中插入数据 v.push_back(10);//尾插法 v.push_back(20); v.

一季南凉的博客 1161

STL最常用的容器vector实现自定义数据的存放

Standard Template Library(STL)基本概念: 目的:为了建立数据结构和算法的一套标准 从广义上可分为:容器,算法,迭代器 细分为六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器 1.容器:将应用最广泛的一些数据结构实现出来 常用的数据结构有:数组,链表,树,栈,队列,集合,映射表等 容器可分为序列式容器(序列式容器中的每个元素均有固定的位置)和关联式容器(二叉树结构,各元素之间没有严格的物理上的顺序关系) 2.算法(Algorithms)

zuoyiyi的博客 505

STL—vector容器

vector相关知识

hffh123的博客 2114
上一篇: 数据结构--立体层次结构
下一篇: 十字链表【待续】
错_对
博客等级 码龄16年 68粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值