类模板实例 实现vector容器
STL的vector容器是一个动态扩容顺序容器,底层就是一个二倍扩容的数组。
在实现vector时,它的实现并没有使用一个数组指针+当前有效位置下标+数组容量大小的形式实现,而是用三个指针来维护这个数组。
有三个指针_first、_last、_end,_first为数组的起始地址,_last指向最后一个有效元素的后继位置,_end指向数组末尾的后继位置。
_first == _last
时,容器为空,_last == _end
时,容器满,_end - _first
为容器容量。
#include <iostream>
using namespace std;
template<typename T>
class vector
{
public:
vector(int size = 10)
{
_first = new T[size];
_last = _first;
_end = _first + size;
}
~vector()
{
delete[] _first;
_first = nullptr;
_last = nullptr;
_end = nullptr;
}
vector(const vector<T>& vec)
{
int size = vec._end - vec._first;
int len = vec._last - vec._first;
_first = new T[size];
for (int i = 0; i < len; i++)
{
_first[i] = vec._first[i];
}
_last = _first + len;;
_end = _first + size;
}
vector<T>& operator=(const vector<T>& vec)
{
if (this == &vec)
return *this;
delete[] _first;
int size = vec._end - vec._first;
int len = vec._last - vec._first;
_first = new T[size];
for (int i = 0; i < len; i++)
{
_first[i] = vec._first[i];
}
_last = _first + len;;
_end = _first + size;
return *this;
}
void push_back(T val)
{
if (isFull())
expend();
*_last++ = val;
}
void pop_back()
{
if (isEmpty())
return;
_last--;
}
T back()const
{
return *(_last - 1);
}
bool isEmpty()const { return _last == _first; }
bool isFull()const { return _end == _last; }
int size()const { return _last - _first; }
private:
void expend()
{
int len = _end - _first;
T* tmp = new T[len * 2];
for (int i = 0; i < len; i++)
{
tmp[i] = _first[i];
}
delete[]_first;
_first = tmp;
_last = _first + len;
_end = _first + len * 2;
}
private:
T* _first; //数组起始地址
T* _last; //最后一个有效元素的后继位置
T* _end; //数组空间的后继位置
};
int main()
{
vector<int> vec;
for (int i = 0; i < 20; i++)
{
vec.push_back(i);
}
while (!vec.isEmpty())
{
cout << vec.back() << " ";
vec.pop_back();
}
}