zoukankan      html  css  js  c++  java
  • 一个简单的vector模版,实现了vector的简单功能

    //===============================================
    //一个简单的vector模版,实现了vector的简
    //单功能。申请内存,通过指向前后的2
    //个指针,不断的更新数据。
    //插入,和删除比较麻烦,需要对数据进行移动。
    //===============================================
    
    
    //===============================================
    //这个文件是Tvector.h文件
    //===============================================
    #pragma once
    ////////每次分配内存的大小的增量
    #define SIZE_ONCE 100
    #include <iostream>
    #include <assert.h>
    
    typedef unsigned int size_u;
    
    template<class _Ty>
    class Tvector
    {
    public:
    	typedef _Ty			value;
    	typedef value*		itor;
    public:
    //////////////缺省构造函数/////////////////////////////////////////
    	Tvector()
    	{
    		_size = SIZE_ONCE;
    		_len = 0;
    		_pFirst = new value[_size + 1];
    		memset(_pFirst,0,sizeof(value)*(_size + 1));
    		_pLast = _pFirst;
    	}
    	//////////////带参构造函数/////////////////////////////////////////
    	Tvector(value val,size_u n)
    	{
    		if(n < 1)
    		{
    			Tvector();
    			return ;
    		}
    		_size = SIZE_ONCE;
    		size_u	cout = n / _size + 1;
    		_size = cout * SIZE_ONCE;
    		_pFirst = new value[_size + 1];
    		_pLast = _pFirst;
    		for(size_u i = 0; i < n; ++i)
    			*_pLast++ = val;
    		_len = n;
    	}
    	///////////////析构函数/////////////////////////////////////////
    	~Tvector()
    	{
    		destory(_pFirst);
    	}
    
    	/////////////下标访问//////////////////////////////////////
    	value& operator[] (size_u index)
    	{
    		if(empty())
    			assert("Tvector为空!");
    		if (index < 0 || index > _len - 1)
    			assert("pos越界!");
    		return _pFirst[index];
    	}
    
    	////////////获取某个元素////////////////////////////////
    	value&	at(size_u pos)
    	{
    		if(empty())
    			assert("Tvector为空!");
    		if (pos < 0 || pos > _len - 1)
    			assert("pos越界!");
    		return _pFirst[pos];
    	}
    
    	///////////从后面插入元素////////////////////////////
    	void	push_back(value val)
    	{
    		itor tem = allot_again(1);
    		if(tem)
    		{
    			itor _pOldF = _pFirst;
    			_pFirst = (itor)memcpy(tem,_pFirst,sizeof(value)*_len);
    			_pLast = _pFirst + _len++;
    			*_pLast++ = val;
    			destory(_pOldF);
    		}
    		else
    		{
    			*(_pLast++) = val;
    			++_len;
    		}
    	}
    	/////////从后面弹出元素///////////////////////////
    	value		pop_back()
    	{
    		if(empty())
    			assert("Tvector为空!");
    
    		value tem = *_pLast;
    		memset(_pLast,0,sizeof(value));
    		--_pLast;
    		--_len;
    		return tem;
    	}
    
    	//////////删除pos位置元素///////////////////////
    	itor	earse(itor _pos)
    	{
    		if(_pos == _pLast)
    			assert(false);
    		size_u _si = _pLast - _pos;
    		move_forward(_pos,_pos + 1,_si - 1);
    		memset(_pLast,0,sizeof(value));
    		--_pLast;
    		--_len;
    		return _pos;
    	}
    
    	itor	earse(itor _begin,itor _end)
    	{
    
    	}
    
    	//////////在pos后面插入元素///////////////////
    	itor	insert(itor pos,value val)
    	{
    		if(pos == _pLast || empty())
    			assert(false);
    
    		itor tem = allot_again(1);
    		if(tem)
    		{
    			itor _pOldF = _pFirst;
    			int a = int(pos - _pFirst) + 1;
    			int b = int(_pLast - pos - 1);
    			_pFirst =(itor) memcpy(tem,_pFirst,a*sizeof(value));
    			*(_pFirst + a ) = val;
    			memcpy(_pFirst + a + 1,pos + 1,b*sizeof(value));
    			_len++;
    			_pLast = _pFirst + _len + 1;
    			destory(_pOldF);
    			return (_pFirst + a + 1);
    		}
    		else
    		{
    			move_backward(pos + 1,pos + 2,_pLast - pos -1 );
    			*(pos+1) = val;
    			++_pLast;
    			++_len;
    			return pos;
    		}
    	}
    	itor	insert(itor pos,value val,size_u n)
    	{
    	}
    	///////////清空元素//////////////////////
    	void	clear()
    	{
    		memset(_pFirst,0,sizeof(value)*(_len + 1));
    		_pLast = _pFirst + 1;
    		_len = 0;
    	}
    
    	///////////是否为空//////////////////////
    	bool	empty()
    	{
    		return 0 == _len;
    	}
    
    	///////////返回元素个数//////////////////////
    	size_u	size()
    	{
    		return _len;
    	}
    	///////////返回开始元素指针//////////////////////
    	itor	begin()
    	{
    		return _pFirst;
    	}
    
    	///////////返回最后元素指针//////////////////////
    	itor	end()
    	{
    		return _pLast;
    	}
    
    private: 
    
    	void	move_forward(itor des,itor res,size_u n)
    	{
    		if(des == res || n < 1)
    			return;
    		for(size_u i = 0;i < n;++i)
    			*des++ = *res++;
    	}
    	void	move_backward(itor res,itor des,size_u n)
    	{
    		if(des == res || n < 1)
    			return;
    		itor tem = new value[n];
    		memcpy(tem,res,n*sizeof(value));
    		memcpy(des,tem,n*sizeof(value));
    		delete[] tem;
    	}
    
    	itor	allot_again(size_u _n)
    	{
    		itor tem = NULL;
    		if(_len + _n > _size)
    		{
    			_size = ((_len + _n) / SIZE_ONCE + 1)*SIZE_ONCE ;
    			tem = new value[_size + 1];
    			memset(tem,0,sizeof(value)*(_size+1));
    		}
    		return tem;
    	}
    
    	void	destory(itor tem)
    	{
    		if(tem)
    			delete[] tem;
    	}
    
    private:
    	itor	_pFirst;
    	itor	_pLast;
    	size_u	_size;
    	size_u	_len;
    };

    测试

    //
    #include "stdafx.h"
    #include <time.h>
    #include <iostream>
    #include <string>
    #include "Tvecor.h"
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	string kstr1 = "cainiao1";
    	string kstr2 = "cainiao2";
    	string kstr3 = "cainiao3";
    	string kstr4 = "cainiao4";
    	string kstr5 = "cainiao5";
    	string kstr6 = "cainiao6";
    	string kstr7 = "cainiao7";
    
    	Tvector<string> kvet;
    	kvet.push_back(kstr1);
    	kvet.push_back(kstr2);
    	kvet.push_back(kstr3);
    	kvet.push_back(kstr4);
    	
    	for(Tvector<string>::itor it = kvet.begin();it!=kvet.end();++it)
    	{
    		cout<< *it << endl;
    	}
    	cout<<endl;
    
    	kvet.push_back(kstr5);
    	kvet.push_back(kstr6);
    	for (unsigned int i=0; i<kvet.size();++i)
    	{
    		cout<<kvet[i] << endl;
    	}
    	cout<<endl;
    
    	kvet.earse(kvet.begin()+2);
    	for (unsigned int i=0; i<kvet.size();++i)
    	{
    		cout<<kvet[i] << endl;
    	}
    	cout<<endl;	
    
    	kvet.pop_back();
    	for (unsigned int i=0; i<kvet.size();++i)
    	{
    		cout<<kvet[i] << endl;
    	}
    	cout<<endl;	
    
    	system("pause");
    	return 0;
    }

    测试结果



  • 相关阅读:
    将vue文件script代码抽取到单独的js文件
    git pull 提示错误:Your local changes to the following files would be overwritten by merge
    vue和uniapp 配置项目基础路径
    XAMPP Access forbidden! Access to the requested directory is only available from the local network.
    postman与newman集成
    postman生成代码段
    Curl命令
    POST方法的Content-type类型
    Selenium Grid 并行的Web测试
    pytorch转ONNX以及TnesorRT的坑
  • 原文地址:https://www.cnblogs.com/byfei/p/6389689.html
Copyright © 2011-2022 走看看