C++ vector 类实现

实现代码

#pragma once
#include<iostream>
template <class T>
class Vector
{
private:
	T* _first;
	T* _last;
	T* _end;
	// 扩容
	bool _GrowMemory(int count, bool retainOgr = false) {
		int capacity = Capacity();
		if (capacity >= count)return false;
		long temp;
		if (capacity < 16) {
			temp = capacity + 16;
		}
		else {
			temp = capacity + capacity / 2;
		}
		if (temp > INT32_MAX) {
			temp = INT32_MAX;
		}
		if (count > temp) {
			temp = count;
		}
		capacity = (int)temp;
		if (retainOgr) {
			T* temp = new T[capacity];
			int len = Length();
			for (int i = 0; i < len; i++) {
				temp[i] = *(_first + i);
			}
			delete[] _first;
			_first = temp;
			_last = _first + len;
			_end = _first + capacity;
		}
		else {
			delete[] _first;
			_first = new T[capacity];
			_last = _first;
			_end = _first + capacity;
		}
		return true;
	}
public:
	//构造函数
	Vector(std::initializer_list<T> list) {
		int len = list.end() - list.begin();
		_first = new T[len];
		for (int i = 0; i < len; i++) {
			*(_first + i) = *(list.begin() + i);
		}
		_last = _first + len;
		_end = _last;
	}
	Vector(const Vector<T>& v) {
		int len = v._last - v._first;
		int capacity = v._end - v._first;
		_first = new T[capacity];
		_last = _first + len;
		_end = _first + capacity;
		for (int i = 0; i < len; i++) {
			*(_first + i) = v[i];
		}
	}
	Vector(int len) {
		_first = new T[len];
		_last = _first + len;
		_end = _last;
	}

	Vector(int len, T val) {
		_first = new T[len];
		_last = _first + len;
		_end = _last;
		for (int i = 0; i < len; i++) {
			*(_first + i) = val;
		}
	}
	Vector() {
		_first = new T[15];
		_last = _first;
		_end = _first + 15;
	}
	//析构函数
	~Vector() {
		delete[] _first;
	}
	//容量
	int Capacity() {
		return _end - _first;
	}
	//可使用长度
	int Length() {
		return _last - _first;
	}
	//索引重载
	T& operator[](int i) {
		if (i >= Length()) {
			throw "索引超出边界";
		}
		return *(_first + i);
	}
	//末尾添加
	void PushBack(const T& val) {
		_GrowMemory(_last - _first + 1, true);
		(*_last) = val;
		_last++;
	}
	//迭代器
	class iterator {
	private:
		T* ptr;
	public:
		iterator(T* p = nullptr):ptr(p) {}
		bool operator!=(const iterator& it) {
			return ptr != it.ptr;
		}
		bool operator==(const iterator& it) {
			return ptr == it.ptr;
		}
		iterator& operator++() {
			++ptr;
			return *this;
		}
		iterator& operator++(int k) {
			iterator temp = *this;
			ptr++;
			return temp;
		}
		iterator& operator--() {
			--ptr;
			return *this;
		}
		iterator& operator--(int k) {
			iterator temp = *this;
			ptr--;
			return temp;
		}
		T& operator*() {
			return *ptr;
		}
	};
	iterator begin() {
		return iterator(_first);
	}
	iterator end() {
		return iterator(_last);
	}
};

测试代码

int main()
{
	//Vector<int> v1;
	Vector<int> v1(10,5);
	try {
		cout << v1[9] << endl;
		cout << v1[10] << endl;
	}
	catch(const char* e){
		cout << e << endl;
	}
	Vector<int>v2{ 1,2,3 };
	cout << v2[0] << endl;
	v2.PushBack(4);
	for (int val : v2) {
		cout << val;
	}
}

输出如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值