C++:模拟实现vector

11_4模拟实现vector

1.string——近容器

vecotr容器(类似于数组)
void resize();//长度和实际长度(实际数据发生变化)
void reserve();//扩容(只改变长度)
void max_size();//最大长度

2.使用模板实现vector

(1)mvector.h

#ifndef MVECTOR_H
#define MVECTOR_H

template<typename T>
class Mvector
{
public:
	Mvector()
	{
		_arr = NULL;
		_len = 0;
		_val_len = 0;
	}

	Mvector(const Mvector& src)
	{
		if (NULL == src._arr)//判断数组为空
		{
			_arr = src._arr;
			_len = src._len;
			_val_len = src._val_len;
		}
		else//有数据或者空间
		{
			_len = src._len;
			_val_len = src._val_len;
			
			_arr = new T[_len];
			for (int i = 0; i < _val_len; i++)
			{
				_arr[i] = src._arr[i];
			}
		}
	}

	~Mvector()
	{
		delete[]_arr;
		_arr = NULL;
	}

	Mvector& operator=(const Mvector& src)
	{
		//防止自赋值
		if (&src == this)
		{
			return *this;
		}

		//防止内存泄漏
		if (NULL != _arr)
		{
			delete[]_arr;
		}

		//防止浅拷贝
		_len = src._len;
		_val_len = src._val_len;
		if (NULL != src._arr)
		{
			_arr = new T[_len];
		}
		else
		{
			_arr = NULL;
		}

		for (int i = 0; i < _val_len; i++)
		{
			_arr[i] = src._arr[i];
		}

		return *this;
	}

	void push_back(const T& val)
	{
		if (full())
		{
			if (_len == 0)
			{
				_len = 1;
			}
			int len = _len << 1;
			reserve(len);
		}

		_arr[_val_len] = val;
		_val_len++;
	}

	void pop_back()
	{
		if (empty())
		{
			return;
		}
		_val_len--;
	}

	T back()const
	{
		if (empty())
		{
			return -1;
		}
		return _arr[_val_len-1];
	}

	int size()const
	{
		return _val_len;
	}

	void resize(int len)
	{
		if (len < 0)
		{
			len = 0;
		}

		if (len == 0)
		{
			delete[]_arr;
			_arr = NULL;
			_len = 0;
			_val_len = 0;
			return;
		}

		T* arr = new T[len];
		memset(arr, 0, len * sizeof(T));
		for (int i = 0; i < len && i < _val_len;i++)
		{
			arr[i] = _arr[i];
		}

		delete[]_arr;
		_val_len = len;
		_arr = arr;
	}

	void reserve(int len)
	{
		if (len <= _val_len)
		{
			return;
		}

		_len = len;
		T* arr = new T[_len];
		for (int i = 0; i < _val_len; i++)
		{
			arr[i] = _arr[i];
		}

		delete[]_arr;
		_arr = arr;
	}

	bool empty()const
	{
		return _val_len == 0;
	}

	T& operator[](int pos)
	{
		return _arr[pos];
	}

	T operator[](int pos)const
	{
		return _arr[pos];
	}
private:
	bool full()
	{
		return _len == _val_len;
	}

	T* _arr;
	int _len;
	int _val_len;
};


#endif

(2)main.cpp

#include<vector>
#include<string>
#include<iostream>
#include"mvector.h"
using namespace std;

/*
*
* 容器
string   ----  近容器
int arr[10]
char str[10]


vector  ----- 容器   -------   数组
*/

void show(Mvector<int> & v)
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << "  ";
	}
	cout << endl;
}

int main()
{
	Mvector<int> v1;
	//cout << v1.back() << endl;

	int a = int();
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	show(v1);

	v1.resize(20);
	show(v1);

	v1.resize(5);
	show(v1);

	v1.resize(10);
	show(v1);

	v1.reserve(10);
	show(v1);

	v1.reserve(2);
	show(v1);

	//cout << v1.max_size();

	v1.pop_back();
	show(v1);

	cout << v1.back();

	v1.resize(-1);
	show(v1);


	/*
	使用模板实现vector
	
	*/

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值