实现代码
#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;
}
}
输出如下