成员变量:
iterator _start=nullptr;
iterator _finish=nullptr;
iterator _end_of_storage=nullptr;
成员函数:
迭代器:
typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}const_iterator begin() const{return _start;}iterator end(){return _finish;}const_iterator end() const {return _finish;}
构造函数:
vector(size_t n, const T& val=T()){for (size_t i = 0; i < size(); i++){push_back(val);}}
template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);first++;}}
template<class T>vector(initializer_list<T> it){for (auto e : it){push_back(e);}}
赋值运算符重载=:
vector<T>& operator=(vector<T> v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);return (*this);}
[]运算符重载:
T& operator[] (size_t n){return _start[n];}const T& operator[] (size_t n)const {return _start[n];}
vector() = default;
加上这句话,在写了带参构造函数的情况下 ,编译器会自动生成默认构造
~vector:
~vector()
{if (_start){delete[]_start;_start = _finish = _end_of_storage = nullptr;}
}
size():
size_t size() const//必须要加{return _finish - _start;}
capacity():
size_t capacity()const //必须要加{return _end_of_storage-_start;}
reserve():
void reserve(size_t n){if (n > capacity()){size_t oldsize = _finish - _start;T* tem = new T[n];if (_start){//memcpy(tem, _start, size() * (_finish - _start));for (size_t i = 0; i < size(); i++){tem[i] = _start[i];}delete[] _start;}_start = tem;_finish = _start + oldsize;_end_of_storage = _start + n;}}
1.memcpy是浅拷贝,对于自定义类型的拷贝,会出现,所以我们使用了另一种 实现方式,能够调用自定义类型的拷贝构造来解决问题
2.这里需要一个oldsize来记录更新_start前_finish与_start的间隔,否则会出现_finish还是原来的_finish的情况
push_back:
void push_back(const T& val){if (capacity() == size()){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}*_finish = val;_finish++;}
pop_back:
void pop_back(){assert(size() > 0);_finish--;}
swap:
void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}
insert:
iterator insert(iterator pos, const T& val)
{assert(pos >= _start);assert(pos <=_finish);size_t len = pos - _start;if (capacity() == size()){size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);}pos = _start + len;T* end = _finish-1;while (end >= pos){*(end + 1) = *(end);end--;}*pos = val;_finish++;return pos;
}
这里需要记录一下pos和_start的距离, 当insert进行扩容的时候,pos位置需要更新,否则pos还是指向已经释放的空间,会出现问题
erase:
iterator erase(iterator pos){assert(pos >= _start);assert(pos < _finish);iterator begin = pos+1;while (begin <=_finish-1 ){*(begin - 1) = *begin;begin++;}_finish--;return pos;}
由于进行删除或插入后迭代器可能失效,所以这里erase和insert都返回一个更新后的迭代器