【C++】vector容器的模拟实现--1 https://developer.aliyun.com/article/1424724
四,赋值运算符
赋值运算符的实现跟拷贝构造函数实现机制相同。实现拷贝后要返回拷贝后的容器,以便实现连续赋值的情况。
vector<T>& operator= (vector<T> v) { int newsize = v.capacity(); reserve(newsize); for (int i = 0; i < newsize; i++) { push_back(v._start[i]); } return *this; }
五,容器接口的实现
1,迭代器实现
这里实现begin()、end()、cbegin()、cend()四种常用的迭代器。
//begin()和end()的实现 iterator begin() { return _start; } iterator end() { return _finish; } //cbegin()和cend()常量迭代器的实现 const_iterator cbegin() const { const_iterator p = (const_iterator)_start; return p; } const_iterator cend() const { const_iterator p = (const_iterator)_finish; return p; }
2,“ [] ”运算符的实现
“ [] ” 运算符实现分为两种,一种是变量的实现,一种是常量const的实现。
//变量实现 T& operator[](size_t pos) { assert(pos >= 0 && pos < size()); return _start[pos]; } //常量实现 const T& operator[](size_t pos)const { assert(pos >= 0 && pos < size()); const T tem = (const T)_start[pos]; return tem; }
3,swap交换和resize重设大小
swap接口实现机制是容器的全部数据实现交换。resize实现时要考虑参数大于容器大小和小于容器大小时的不同情况。
//交换算法 void swap(vector<T>& v) { std::swap(_start, v._start); std::swap(_finish, v._finish); std::swap(_endOfStorage, v._endOfStorage); } //设定大小算法 void resize(size_t n, const T& value = T()) { assert(n >= 0); //防止错误操作 if (n < size()) //小于容器大小时的情况 { _finish = _start + n; } else //大于等于容器大小时的情况 { reserve(n); for (int i = 0; i < n - size(); i++) { push_back(value); } } }
4,insert插入和erase删除
这里实现insert插入要注意的是选择位置时,因为不确定数据类型,因此要在指定迭代器的位置进行插入,最后返回该位置的迭代器。
erase删除位置与insert插入位置一样,删除迭代器所指向的位置,最后返回该位置的迭代器。
//插入算法,在pos位置下插入数据x iterator insert(iterator pos, const T& x) { //要考虑指定插入的位置在合理范围之内 assert(pos >= _start && pos < _finish); if (size() == capacity()) { reserve(size() + 1); } for (iterator it = _finish - 1; it >= pos; it--) { *(it + 1) = *(it); } *pos = x; return pos; } //删除算法,删除pos位置下的数据 iterator erase(iterator pos) { //要考虑指定删除的位置在合理范围之内 assert(size() > 0); assert(pos >= _start && pos < _finish); for (iterator i = pos; i < _finish - 1; i++) { *(i) = *(i + 1); } _finish--; return pos; }