18实现C++ STL顺序容器vector-代码

实现C++ STL顺序容器vector -- 代码

下述代码缺少容器的空间配置器

#include<iostream>
using namespace std;

template<typename T>
class vector {
private:
	T* _first;  //数组起始位置
	T* _last; //数组有效元素的后继位置
	T* _end;  //数组空间的后继位置
	void resize()
	{
		int size = _end - _first;
		T* _tmp = new T[size * 2];
		for (int i = 0; i < size; i++)
		{
			_tmp[i] = _first[i];
		}
		delete[]_first;
		_first = _tmp;
		_end = _first + size * 2;
		_last = _first + size;
	}
public:
	vector<T>(int size = 4)
	{
		_first = new T[size];
		_last = _first;
		_end = _first + size;
	}
	~vector<T>()
	{
		delete[]_first;
		_end = _last = _first = nullptr;
	}
	vector<T>(const vector<T>& rhs)
	{
		int size = rhs._end - rhs._first;
		int len = rhs._last - rhs._first;
		_first = new T[size];
		for (int i = 0; i < len; i++)
		{
			_first[i] = rhs._first[i];
		}
		_last = _first + len;
		_end = _first + size;
	}
	vector<T> operator=(const vector<T>& rhs)
	{
		if (this == &rhs)
		{
			return *rhs;
		}
		delete[]_first;
		int size = rhs._end - rhs._first;
		int len = rhs._last - rhs._first;
		_first = new T[size];
		for (int i = 0; i < len; i++)
		{
			_first[i] = rhs._first[i];
		}
		_last = _first + len;
		_end = _first + size;
	}
	void push_back(const T &rhs)//向容器末尾添加元素
	{
		if (full())
		{
			resize();
		}
		*_last++ = rhs;
	}

	T& pop_back()
	{
		if (empty())
		{
			throw "empty";
		}
		return *--_last;
	}

	int full() const
	{
		return _last == _end;
	}

	int empty() const
	{
		return _last == _first;
	}

	int size()const
	{
		return _last - _first;
	}
	int capacity() const
	{
		return _end - _first;
	}
};

int main()
{
	vector<int> vec;
	for (int i = 0; i < 10; i++)
	{
		vec.push_back(rand() % 100);
	}
	cout << vec.capacity() << endl;
	cout << vec.size() << endl;
	while (!vec.empty())
	{
		cout << vec.pop_back() << endl;
	}
	cout << vec.capacity() << endl;
	cout << vec.size() << endl;
	return 0;
}
posted @ 2024-01-20 23:22  SIo_2  阅读(19)  评论(0)    收藏  举报