当前位置: 首页 > news >正文

C++容器之vector模拟实现(代码纯享版!!!)

目录

前言

一、头文件 .h文件

总结



前言

本文是模拟实现vector部分功能的代码,可以直接拿去使用

一、头文件 .h文件

#include<assert.h>
#include<iostream>
using namespace std;
namespace zz
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector()//默认构造{}vector(const vector<T>& v)//拷贝构造{reserve(v.size());for (auto& e : v){push_back(e);}}~vector()//析构{if (_start){delete[] _start;_start = _finish = _end_of_storage = nullptr;}}void clear(){_finish = _start;}const vector<T> operator=(const vector<T>& v){if (this != &v){clear();reserve(v.size());for (auto& e : v){push_back(e);}}return *this;}template <class InputIterator>vector(InputIterator first, InputIterator last){while (first!=last){push_back(*first);++first;}}vector(size_t n, const T& val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}vector(int n, const T& val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}bool empty(){return _start == _finish;}void reserve(size_t n){if (n > capacity()){size_t old_size = size();T* tmp = new T[n];//memcpy(tmp, _start, size() * sizeof(T));如果是vector<string>这里就是浅拷贝,要换成下边赋值的写法for (size_t i = 0; i < old_size; i++){tmp[i] = _start[i];}delete[] _start;_start = tmp;_finish = tmp + old_size;_end_of_storage = tmp + n;}}T& operator[](size_t i){assert(i < size());return _start[i];}size_t size()const{return _finish - _start;}size_t capacity()const{return _end_of_storage - _start;}void push_back(const T& x){if (_finish != _end_of_storage){*_finish = x;++_finish;}else{reserve(capacity() == 0 ? 4 : 2 * capacity());*_finish = x;++_finish;}}void pop_back(){assert(!empty());--_finish;}iterator  insert(iterator pos, const T& v){assert(pos >= _start);assert(pos <= _finish);if (_finish == _end_of_storage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : 2 * capacity());pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end+1)=*end;--end;}*pos = v;++_finish;return pos;}//也会造成迭代器失效void earse(iterator pos){assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it!=end()){*(it - 1) = *it;it++;}--_finish;}T& operator[](size_t i)const{assert(i < size());return _start[i];}void resize(size_t n, const T& val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}}private:iterator _start=nullptr;//指向数据块的开始iterator _finish=nullptr;//指向有效数据的尾iterator _end_of_storage=nullptr;//指向存储容量的尾};template <class T>void print_vector(const vector<T>& v){//不加typename的话编译器不能从没有实例化的类模板里边取东西,编译器无法区分const_iterator是类型还是静态成员变量typename vector<T>::const_iterator it = v.begin();//这里也可以写成auto it=v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v){cout << e << " ";}}

总结

以上就是vector容器模拟实现的代码,实现了基本的常用的功能,一些很少用的没有实现,纯手打。希望亲们点点发财的小手点个赞!!!!!


http://www.mrgr.cn/news/40629.html

相关文章:

  • [云] Getting Started with Kubernetes - Environment setup 环境配置
  • Total_Expectation_Conditional_Bias_Variance_Tradeoff
  • 超分服务的分量保存
  • LeetCode 0983.最低票价:记忆化搜索
  • Chromium 用户数据目录User Data 初始化过程c++
  • 电力、电子、电气、电器,怎么说明白?
  • Axios 和 Ajax 的区别与联系
  • 当贝播放器 1.5.0 畅享原画,支持阿里网盘、杜比视界和8K播放
  • Stm32的bootloader无法使用问题
  • 【C++进阶】多态
  • 2024/10/1 408大题专训之磁盘管理
  • VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理
  • Linux服务器配置anaconda3,下载torch
  • Java基础 3. 面向对象
  • 考研数据结构——顺序表代码题
  • 差分(续前缀和)(含一维二维)
  • 力扣题解 983
  • 如何用TorchAO优化PyTorch模型:看得见的性能提升
  • .888勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • 0基础学前端 day9--css布局