这是我看过STL之后自己实现的一个vecotr,vector为何能动态增长,这主要是由于在原vecotr的空间满了之后,需要再重新分配空间,对于之前的内存,需要回收回来。在我们使用vector的迭代器时,尤其要注意是否过期了!
-
#include <iostream> #include <memory> using std::cout; using std::endl; template<typename T> class Vector{ public: Vector() : _elem(0) , _fisrtFree(0) , _end(0) {} ~Vector() { if(_elem){ while(_fisrtFree != _elem) _alloc.destroy(--_fisrtFree); _alloc.deallocate(_elem, capacity()); } } void push_back(const T & value) { if(size() == capacity()) reallocate(); _alloc.construct(_fisrtFree++, value); } void pop_back() { if(size() > 0) _alloc.destroy(--_fisrtFree); } const T & operator[](int idx) const { return *(_elem + idx); } int size() const { return _fisrtFree - _elem; } int capacity() const { return _end - _elem; } private: void reallocate() { int oldCapacity = capacity(); int newCapacity = (oldCapacity != 0 ? 2 * oldCapacity : 1); //1.开辟空间 T * newElem = _alloc.allocate(newCapacity); if(_elem) { //2.把原来空间的元素copy新空间去 std::uninitialized_copy(_elem, _fisrtFree, newElem); //3.销毁原来空间的对象 while(_elem != _fisrtFree) _alloc.destroy(--_fisrtFree); //4.销毁原来的空间 _alloc.deallocate(_elem, oldCapacity); } //5.对新空间的指针进行赋值 _elem = newElem; _fisrtFree = newElem + oldCapacity; _end = newElem + newCapacity; } private: static std::allocator<T> _alloc; T *_elem; T *_end; T *_fisrtFree; }; template <typename T> std::allocator<T> Vector<T>::_alloc; void display(const Vector<int> & vec) { cout << "vec's size = " << vec.size() << endl; cout << "vec's capa = " << vec.capacity() << endl; } void print(const Vector<int> & vec) { for(int idx = 0; idx < vec.size(); ++idx) { cout << vec[idx] << " "; } } int main(void) { Vector<int> vec; display(vec); vec.push_back(1); display(vec); vec.push_back(2); display(vec); vec.push_back(3); display(vec); vec.push_back(4); display(vec); vec.push_back(5); display(vec); vec.push_back(6); display(vec); vec.push_back(7); display(vec); cout << endl; print(vec); return 0; }