c++ vector(模拟实现)

本文深入探讨C++标准库中的vector容器,介绍其内部原理并模拟实现关键操作,包括动态内存管理、元素插入和删除的效率分析。通过实例代码展示vector如何在不同场景下工作,帮助理解其在内存管理和性能上的考量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
using namespace std;

namespace bit
{
	template<typename T>
	class vector
	{
	public:
		typedef T* iterator;
	public:
		T operator[](int i)
		{
			return start[i];
		}
	public:
		vector() :start(nullptr), finish(nullptr), end_of_sorage(nullptr)
		{
		}
		vector(size_t n, const T& value = T()) :start(nullptr), finish(nullptr), end_of_sorage(nullptr)
		{
			reserve(n);//先扩容
			while (n--!=0) //再填充
			{
				push_back(value);
			}
		}
		template<class InPutIterator>  //由前后指针来创建
		vector(InPutIterator first, InPutIterator last):start(nullptr), finish(nullptr), end_of_sorage(nullptr)
		{
			reserve(last-first);//先申请空间
			while (first != last)
			{
				push_back(*first);
				first++;
			}
		}
		~vector()
		{
			delete[]start;
			start = finish = end_of_sorage = nullptr;
		}
	public:
		int size()
		{
			return finish - start;
		}
		int capacity()
		{
			return end_of_sorage - start;
		}
		bool empty()
		{
			return finish == start;
		}
		void swap(vector<T>& v)
		{
			std::swap(start, v.start);
			std::swap(finish, v.finish);
			std::swap(end_of_sorage, v.end_of_sorage);
		}
		void reserve(size_t new_capacity) // 扩容
		{
			if (new_capacity > capacity())
			{
				int old_size = size();  //原来的大小 
				T* newV = new T[new_capacity];  //新申请空间
				if (start)//当原有内容不空时
				{
					for (int i = 0; i < size(); i++)  //复制进新空间
					{
						newV[i] = start[i];
					}
				}
				delete[]start;//删除原有空间
				start = newV;//指向新空间
				finish = start + old_size;
				end_of_sorage = start + new_capacity;
			}
		}
		void resize(int new_size, const T& value = 0) //扩充大小
		{
			if (new_size <= size())
			{
				finish = start + new_size;
			}
			if (new_size > capacity())
			{
				reserve(new_size * 2);
			}
			iterator p = finish;
			finish = start + new_size;//指向新大小
			while (p != finish) //填充value
			{
				*p = value;
				p++;
			}
		}
	public:
		void push_back(const T &c)
		{
			insert(end(), c);
		}
	public:
		typedef T* iterator;
		iterator begin()
		{
			return start;
		}
		iterator end()
		{
			return finish;
		}
	public:
		iterator insert(iterator pos, const T &x) //在pos位置前插入x
		{
			if (size() + 1 >= capacity())
			{
				size_t oldpos = pos - start;
				size_t new_capacity = capacity() ? (capacity() * 2) : 1;
				reserve(new_capacity);
				pos = start + oldpos;
			}
			T* p = finish;
			for (; p != pos; p--)
			{
				*p = *(p - 1);
			}
			*p = x;
			finish++;
			return pos;
		}
		iterator erase(iterator pos) //删除pos位置值
		{
			T* p = pos;
			while (p != finish - 1)
			{
				*p = *(p + 1);
				p++;
			}
			finish--;
			return pos;
		}
	private:
		T* start;//指向最开始
		T* finish;//指向最后一个元素的下一个位置
		T* end_of_sorage;//指向最大容量的下一个位置
	};
}

int main()
{
	int ar[] = { 1,2,3,4,5,6,7,7 };
	bit::vector<int>v1(ar, ar + 6);
	bit::vector<int>v2;
	bit::vector<int>v3(10,'a');
	v1.erase(v1.end()-1);
	v1.insert(v1.begin(), 0);
	v1.swap(v3);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值