#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(...){ }
相关推荐
私彩视频开奖动画直播源码内部核心技术解析及修改可增加后台操控-持续更新文章!
其实在此很感谢能做出H5开奖系统的码农们,而我本人也喜欢分解此类的东西。 因为特殊原因,该东西本人就不做图片展示,以防他人商业化。 借用开奖摇奖代码首先分解首页index文件。代码如下:(后面持续在原有的作品上添加后台操作) 代码里写的//.....是我的注明代码的所需。 <!DOCTYPE html> <html> <head> <...
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<
Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板)
本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。
自定义一个vector向量类
C++标准模板库STL给出了vector,list,deque,stack,set,map等模板类,平时我们直接使用居多,对于类内部怎么实现不在意。现在以向量类vector为例,简单自定义: 其UML: vetor -数组名ele:T -数组目前大小size:int -数组容量cap:int +vector();//用指定元素类型创建一个空向量 +sure():void//当增加元素
通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控
ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。
Abel逆变换及其求解方法
Abel逆变换常应用在轴对称的、光学薄的火焰、羽流或等离子体重建。
C++ 简析容器Vector
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 一、基本概念向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能...
深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱
本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。
C++(21)——vector及实现自定义vector以及allocator和iterator
简介 作用:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 vector是表示可以改变大小的数组的序列容器。 与数组一样,vector对元素使用连续的存储位置,这意味也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样高效。 但是与数组不同,它们的大小可以动态变化,容器会自动处理它们的存储。 在内部,vector 使用个动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增大大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言
堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析
Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。
ITIL 4 讲解:服务目录
最近一直比较忙,没有时间写文章了。今天有空,写写服务目录。 在最近的项目中,服务目录是比较热的话题。金融行业大部分银行、证券、金融公司都实行ITIL流程管理有些年头了,ITIL中最基础的服务请求、事件、问题和变更都已经实施完毕,目前客户在运维领域做的项目大部分都要求整理服务目录,实行服务级别管理。 服务目录介绍 首先解释一下什么是服务目录。服务目录在ITIL 4的定义是:有关服务提供商的所有服务和服务产品的结构化信息,与特定目标受众相关。这个解释有些晦涩难懂,简单来说就是提供给业务用户的服务项,就像饭
vector容器 常用函数
C++ vector容器,常用函数介绍
电子电器架构 -- 汽车零部件DV试验与PV试验的定义及关键差异
电子电器架构 -- 汽车零部件DV试验与PV试验的定义及关键差异
详解vector容器
介绍vector,详解各主要接口的使用,OJ的运用,模拟实现
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
STL常用容器—vector容器
整理归纳C++ STL的vector容器,主要包括对容器的增删改查操作,vector作为最常用的容器之一,需重点把握
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
C++ Vector容器
数组array,一旦配置了就不能改变。如果要改变空间大小,就需要重新定义一个数组,将旧数据搬到新空间中,并释放原来的空间。vector是一个封装了动态大小数组的顺序容器(单端数组,向量),能够存放各种类型的对象。与普通数组不同,vector可以动态地增长和缩小,以适应程序的需求。vector具有连续存储的特点,这意味着它的元素在内存中是连续存储的,使得访问元素非常快速。为了使用vector,需要包含头文件v.begin();//获取容器的其实迭代器(指向第0个元素)v.end();
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
【C++篇】Vector容器 Vector嵌套容器
it!= v.end();it++)cout
vector容器简介(一篇文章让你彻底认识vector容器)
vector容器是一个类似于单边数组的容器,他可以存放自定义数据类型和内置数据类型,它的书写方式为vector 容器名称 例如我们存储int数据就是vector v1;可以实现随机访问容器中的元素,他的扩展方式是动态扩展,即当容器空间满了之后,它会寻找新空间并将原先数据拷贝到新空间再释放旧的空间。它可以通过尾插法和尾删法来添加删除元素也可以通过insert来插入元素,它有四个迭代器可以让我们访问容器中的元素,其中v.begin()和v.end(),分别指向容器中的第一个元素和最后一个元
C++进阶——vector容器
本人为C++小白,初次接触STL,本篇内容为学习c++时的一些笔记,方便以后复习使用,有错误以及不足之处还请各位大佬们指正。
C++中自定义vector容器
/static_cast<size_t>(-1) 表示 size_t 类型能存储的最大值(因为 size_t 是无符号类型,-1 会被转换为该类型的最大值)。while (m_size + num >= m_capacity)//超过容量扩展。while (m_size+num >= m_capacity)//超过容量扩展。
vector容器详解
vector数据结构和数组非常相似,也称为单端数组。vector可以说是一个动态数组,它可以存储任何类型的数据,包括类! vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展** 动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间 vector容器的迭代器是支持随机访问的迭代器 使用vector需包含头文件#include< vector > 1. ...
STL——array和vector容器
STL——array和vector容器详解
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.
STL最常用的容器vector实现自定义数据的存放
Standard Template Library(STL)基本概念: 目的:为了建立数据结构和算法的一套标准 从广义上可分为:容器,算法,迭代器 细分为六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器 1.容器:将应用最广泛的一些数据结构实现出来 常用的数据结构有:数组,链表,树,栈,队列,集合,映射表等 容器可分为序列式容器(序列式容器中的每个元素均有固定的位置)和关联式容器(二叉树结构,各元素之间没有严格的物理上的顺序关系) 2.算法(Algorithms)
STL—vector容器
vector相关知识
5995



被折叠的 条评论
为什么被折叠?



