【STL】之Vector的模拟实现

本文详细介绍了一个手写的vector类的实现过程,包括构造函数、迭代器操作、容量操作、元素访问等核心接口。通过三个测试函数展示了如何使用这个自定义的vector类进行基本操作,如初始化、插入、删除和查找元素。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<vector>
#include <algorithm>
#include <assert.h>
#include <string> 
#include<iostream>	
using namespace std;

//vector核心接口的模拟实现
namespace myself
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef T* reverse_iterator;
		typedef const T* ConstIterator;

	public:
		vector()       //无参构造
			:_start(nullptr)
			, _last(nullptr)
			, _endofStorage(nullptr)
		{ }

		vector(size_t n, const T& data = T())   //n个值为data的元素,缺省构造
			:_start(new T[n])
			, _last(_start + n)
			, _endofStorage(_last)
		{
			for (size_t i = 0; i < n; ++i)
				_start[i] = data;

		}

		vector(T* first, T* last)    //必须给一段连续的空间 [first,last)
		{
			size_t size = last - first;
			_start = new T[size];

			for (size_t i = 0; i < size; ++i)
				_start[i] = first[i];
			//memcpy(_start, first, size * sizeof(T));
			_last = _start + size;
			_endofStorage = _last;
		}

		vector(const vector<T>& v)  //类类型对象的引用--->拷贝构造函数
			:_start(nullptr)
			, _last(nullptr)
			, _endofStorage(nullptr)
		{
			reserve(v.capacity());  //开辟空间
			iterator it = begin();
			ConstIterator vit = v.cbegin();
			while (vit != v.cend())
			{
				*it++ = *vit++;   //赋值
			}
			_last = _start + v.size();
			_endofStorage = v.capacity() + _start;
		}
		vector<T>& operator=(const vector<T> v)  //赋值运算符重载
		{
			swap(_start, v._start);
			return *this;
			//注意深浅拷贝的问题
		}

		//----------------------迭代器操作--------------------// 
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _last;
		}
		ConstIterator cbegin() const
		{
			return _start;
		}
		ConstIterator cend() const
		{
			return _last;
		}
		reverse_iterator rbegin()
		{
			return end();
		}
		reverse_iterator rend()
		{
			return begin;
		}

		///////////////////容量操作capacity
		size_t size()const
		{
			return _last - _start;
		}
		size_t capacity()const
		{
			return _endofStorage - _start;
		}
		bool empty()const
		{
			return _start == _last;
		}
		void resize(size_t newSize, const T& data = T())  //增加元素个数 
		{
			size_t oldSize = size();
			if (newSize <= oldSize)   //减少元素个数
				_last = _start + newSize;
			else
			{
				size_t Capacity = capacity();
				if (newSize <= Capacity)    //多出来的元素空间放得下
				{
					for (size_t i = oldSize; i < newSize; ++i)
						*_last++ = data;
				}
				else   //多出来的元素空间放不下需要增容
				{
					T* pTemp = new T[newSize];
					for (size_t i = 0; i < oldSize; ++i)   //旧元素
						pTemp[i] = _start[i];
					for (size_t i = oldSize; i < newSize; ++i)  //新元素
						pTemp[i] = data;

					delete[] _start;
					_start = pTemp;
					_last = _start + newSize;
					_endofStorage = _last;
				}
			}
		}

		void reserve(size_t newcapacity)   //扩容
		{
			size_t oldcapacity = capacity();
			if (newcapacity > oldcapacity)
			{
				size_t Size = size();
				T* pTemp = new T[newcapacity];
				if (_start)
				{
					for (size_t i = 0; i < size(); ++i)
						pTemp[i] = _start[i];
				}
				_start = pTemp;
				_last = _start + Size;
				_endofStorage = _start + newcapacity;
			}
		}

		T& operator[](size_t index)
		{
			return _start[index];
		}
		const T& operator[](size_t index)const
		{
			return _start[index];
		}
		T& front()
		{
			return *_start;
		}
		const T& front()const
		{
			return *_start;
		}
		T& back()
		{
			return *(_last - 1);
		}
		const T& back()const
		{
			return *(_last - 1);
		}


		void push_back(const T& data)
		{
			/*
			if (size() == capacity())
			reserve(capacity() * 2+2);
			*_last++ = data;
			*/
			insert(end(), data);
		}

		void pop_back()
		{
			--_last;
		}
		iterator insert(iterator pos, const T& data)   //将data插在pos的位置,返回新插入元素的位置
		{
			assert(pos <= _last);
			if (_last == _endofStorage)    //空间不够先增容
			{
				size_t NewCapacity = capacity() == 0 ? 1 : capacity() * 2 + 1;
				reserve(NewCapacity);
				pos = _start + size();  //扩容后需要重置迭代器(旧的已失效)
			}
			iterator End = _last - 1;
			while (End >= pos)
			{
				*(End + 1) = *End;  //向后覆盖数据
				--End;
			}
			*pos = data;
			++_last;
			return pos;
		}

		iterator erase(iterator pos)   //删除pos位置处的data值,返回删除数据的下一个数据
		{
			assert(pos <= _last);
			iterator begin = pos + 1;
			while (begin != _last)
			{
				*(begin - 1) = *begin;  //向前覆盖数据
				begin++;
			}
			--_last;
			return pos;
		}
		void swap(vector<T>& v)
		{
			swap(_start, v._start);
			swap(_last, v._last);
			swap(_endofStorage, v._endofStorage);
		}
		void clear()
		{
			_last = _start;
		}
		~vector()    //析构
		{
			if (_start)
			{
				delete[] _start;
				_start = _last = _endofStorage = nullptr;
			}
		}
	private:
		iterator _start;   //指向数据块的开始  
		iterator _last;    //指向有效数据的尾(size = _last - _start)
		iterator _endofStorage;    //指向存储容量的尾(capacity)
	};
}



-----------------------------------test-----------------------------------
void TestVector1()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	myself::vector<int> v1(4, 100);
	myself::vector<int> v2(arr, arr + sizeof(arr) / sizeof(arr[0]));
	myself::vector<int> v3(v1);
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	for (auto e : v1)
		cout << e << " ";
	cout << endl;
	for (auto it = v2.begin(); it != v2.end(); ++it)
		cout << *it << " ";
	cout << endl;
	for (auto it = v3.begin(); it != v3.end(); ++it)
		cout << *it << " ";
	cout << endl;
}

void TestVector2()
{
	myself::vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);

	myself::vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 30);
	v.erase(pos);
	/*
	for (size_t i = 0; i < v.size(); ++i)
	{
	cout << v[i] << " ";
	}
	cout << endl;
	*/

	myself::vector<int>::iterator it = v.begin();
	while (it != v.end())  //迭代器遍历打印
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
void TestVector3()
{
	int arr[] = { 1,2,3,4 };
	myself::vector<int> v(arr, arr + sizeof(arr) / sizeof(arr[0]));
	myself::vector<int>::iterator pos = find(v.begin(), v.end(), 3);
	v.erase(pos);
	cout << *pos << endl;
}
int main()
{
	//TestVector1();
	//TestVector2();
	TestVector3();
	system("pause");
	return 0;
}

 

代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值