C++实现vector类模板(部分功能)

c++实现vector类模板

#pragma once

template<class T>
class CMyVector
{
	T *vector;
	int first;		//指向vector第一个元素
	int last;		//指向vector最后一个元素
	int capacity;	//vector总大小
public:
	CMyVector()
	{
		vector = NULL;
		first = last = capacity = 0;
	}
	CMyVector(CMyVector const& other)
	{
		capacity = other.capacity;
		vector = new T[capacity];
		for (int i = 0; i < other.size(); i++)
			vector[i] = other.vector[i];
		first = other.first;
		last = other.last;
	}
	~CMyVector()
	{
		if (vector)
		{
			delete[] vector;
		}
		vector = NULL;
	}

	//赋num个值为val的元素到vector中.
	//这个函数将会清除掉为vector赋值以前的内容
	void assign(int num, T const& val)		
	{
		clear();
		if (capacity == 0)
		{
			resize(num);
		}
		for (int i = 0; i < num; i++)
			vector[last++] = val;
	}

	//在Vector最后添加一个元素
	void push_back(T const& val)		
	{
		if (last == capacity)
		{
			int volume = capacity + (capacity >> 1);
			resize(volume);
		}
		vector[last++] = val;
	}

	//移除最后一个元素
	void pop_back()			
	{
		last--;
	}

	//在指定位置前插入num个值为val的元素到Vector中
	void insert(int loc, int num, T const& val)		
	{
		if (loc < last && loc >= first)
		{
			if ((last + num) >= capacity)
			{
				resize(last + num);
			}
			int end = last - 1;
			for (int i = last + num - 1; i >= loc + num; i--)
			{
				vector[i] = vector[end--];
			}
			for (int i = loc; i < loc + num; i++)
			{
				vector[i] = val;
			}
			last = last + num;
		}
		else
			printf("指定位置错误!\n");
	}

	//返回指定位置的元素
	T at(int loc) const
	{
		if (loc < last && loc >= first)
			return vector[loc];
		else
			printf("指定位置错误!\n");
	}

	//返回Vector元素数量的大小
	int size()		
	{
		return last - first;
	}

	//扩容
	void resize(int volume)	
	{
		if (volume > capacity)
		{
			T *temp = new T[volume];
			for (int i = 0; i < size(); i++)
				temp[i] = vector[i];
			delete[] vector;
			vector = temp;
			capacity = volume;
		}
		else
			printf("size必须大于当前容量!\n");
	}

	//清空
	void clear()		
	{
		erase(first, last);
	}

	//删除指定元素
	void erase(int loc)		
	{
		if (loc < last && loc >= first)
		{
			for (int i = loc; i < last - 1; i++)
			{
				vector[i] = vector[i + 1];
			}
			last--;
		}
		else
			printf("指定位置错误!\n");
	}

	//删除区间[start,end)之间的元素
	void erase(int start, int end)		
	{
		if (start >= first && end > start && end < last)
		{
			for (int i = start; i < last; i++)
			{
				if (end < last)
				{
					vector[i] = vector[end++];
				}
				else
				{
					last = i;
					break;
				}
			}
		}
		else if (start == first && end == last)
		{
			capacity = last = first;
		}
		else
			printf("区间错误!\n");
	}
};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海螺蜜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值