今天自己试着写了自己的vector容器
// 以下为头文件Vector.h
#include <iostream>
#include <algorithm>
using namespace std;
template<class T>
class Vector
{
public:
Vector() : elements(0), free_list(0), endelement(0) {}
template<class Type>
Vector(Type be, Type en);
void push_back(const T&);
int size();
int capacity();
T* begin();
T* end();
T& operator[](const int index);
private:
void reallocate();
allocator<T> alloc;
T *elements;
T *free_list;
T *endelement;
};
template<class T> template<class Type>
Vector<T>::Vector(Type be, Type en)
{
elements = alloc.allocate(en - be);
free_list = elements;
endelement = elements + (en - be);
while (be != en)
{
push_back(*be++);
}
}
template<class T>
void Vector<T>::push_back(const T &val)
{
if (free_list == endelement)
reallocate();
alloc.construct(free_list, val);
++free_list;
}
template<class T>
int Vector<T>::size()
{
return free_list - elements;
}
template<class T>
int Vector<T>::capacity()
{
return endelement - elements;
}
template<class T>
T* Vector<T>::begin()
{
return elements;
}
template<class T>
T* Vector<T>::end()
{
return free_list;
}
template<class T>
void Vector<T>::reallocate()
{
int size = free_list - elements;
int capacity = 2 * size;
T *newelements = alloc.allocate(capacity);
uninitialized_copy(elements, elements + size, newelements);
T *p = free_list;
while (p != elements)
{
alloc.destroy(--p);
}
if (elements)
alloc.deallocate(elements, size);
elements = newelements;
free_list = elements + size;
endelement = elements + capacity;
}
template<class T>
T& Vector<T>::operator [](const int index)
{
return *(elements + index);
}
// 以下是主函数部分 main.cpp
#include <iostream> #include <vector> #include "Vector.h" using namespace std; int main() { int ia[5] = {4, 1, 2, 5, 6}; Vector<int> ivec(ia, ia+5); ivec.push_back(100); cout << ivec[2] << endl; cout << ivec.size() << endl; cout << ivec.capacity() << endl; cout << *(ivec.begin()) << endl; return 0; }
如果大家觉得我还有必要实现某些功能,欢迎大家指点。