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

【C++】vector模拟实现

实现以下功能:

  1. 构造函数:a.无参默认构造    b.n个val构造    c.迭代器区间构造    d.initializer_list构造,类似于数组    e.拷贝构造

  2. =赋值重载

  3. [ ]重载

  4. 实现reserve接口

  5. 实现size(),capacity()接口

  6. 实现push_bakc接口,尾插

  7. 实现insert接口,位置插入

  8. 实现erase接口,位置删除

  9. 实现pop_back接口,尾删

  10. 实现empty接口,判断容器是否为空

  11. 实现迭代器

#pragma once
#include<assert.h>
#include<iostream>
#include<algorithm>
using namespace std;/*
inrsert
push_backpop_back
erasereserve
capacity()
size()
empty()begin()
end()operator[]
*/namespace liu
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector():_start(nullptr),_finish(nullptr),_endofstorage(nullptr){}~vector(){if (_start){delete[] _start;}_start = nullptr;_finish = nullptr;_endofstorage = nullptr;}template<class InputIterator>vector(InputIterator first, InputIterator last)//迭代器区间初始化{while (first!=last){push_back(*first);++first;}}vector(size_t n, const T& val = T())//n个VAL初始化{reserve(n);//提前开好空间,减少消耗for (size_t i=0;i<n;i++){push_back(val);}}vector(int n, const T& val = T()){reserve(n);//提前开好空间,减少消耗for (int i = 0; i < n; i++){push_back(val);}}//v2(v1)vector(const vector<T>& v)//拷贝构造:_start(nullptr), _finish(nullptr), _endofstorage(nullptr){reserve(v.capacity());for (auto& e:v){push_back(e);}}vector(initializer_list<T> il){reserve(il.size());{for (auto& e:il){push_back(e);}}}void swap(vector<T>& v){std::swap(_start,v._start);std::swap(_finish,v._finish);std::swap(_endofstorage,v._endofstorage);}vector<T>& operator=(vector<T> v){swap(v);return *this;}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin()const{return _start;}const_iterator end()const{return _finish;}T& operator[](size_t i){assert(i<size());return _start[i];}const T& operator[](size_t i)const{assert(i < size());return _start[i];}void reserve(size_t n)//不仅是内部用,还要提供给外部用{if (n>capacity()){size_t oldSize = size();T* tmp = new T[n];if (_start){for (size_t i=0;i<oldSize;i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + oldSize;_endofstorage = _start + n;}}size_t size(){return _finish - _start;}size_t capacity(){return _endofstorage - _start;}void push_back(const T& x){if (_finish==_endofstorage){reserve(capacity()==0?4:2*capacity());}*_finish = x;_finish++;}iterator insert(iterator pos,const T& val){assert(pos>=_start&&pos<=_finish);if (_finish==_endofstorage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : 2 * capacity());pos = _start + len;}iterator i = _finish-1;while(i>=pos){*(i + 1) = *i;i--;}*pos = val;++_finish;return pos;//更新迭代器}iterator erase(iterator pos){assert(pos >= _start && pos < _finish);iterator i = pos+1;while (i<_finish){*(i-1) = *i;i++;}--_finish;return pos;}void pop_back(){assert(!empty());_finish--;}bool empty(){return _start == _endofstorage;}private:iterator _start;iterator _finish;iterator _endofstorage;};
} 

相关文章:

  • 优化model我们可能会怎么做(具体)
  • 正则表达式进阶(三):递归模式与条件匹配的艺术
  • HarmonyOS5云服务技术分享--云存储SDK文章整理
  • 数据库基础
  • 【[特殊字符] Vue 3 实现动态加载子组件并缓存状态完整指南】
  • uniapp生成的app,关于跟其他设备通信的支持和限制
  • 48、c# 中 IList 接⼝与List的区别是什么?
  • 深入解析Spring Boot与Redis的缓存集成实践
  • Spark Core基础与源码剖析全景手册
  • Java转Go日记(四十一):Gorm删除
  • 【iOS】类结构分析
  • 中间件-seata
  • [Linux] Linux线程信号的原理与应用
  • (二十四)Java网络编程全面解析:从基础到实践
  • 在 Excel 中使用通义灵码辅助开发 VBA 程序
  • LeetCode 1345. 跳跃游戏 IV(困难)
  • ZooKeeper 原理解析及优劣比较
  • Gartner《AI Infrastructure WithKubernetes参考架构》学习心得
  • LabVIEW下AI开发
  • 杰里7006d日志分析
  • 上海地铁:9号线因雨天打滑,佘山往九亭方向部分列车限速运行
  • 昆明市委:今年起连续三年,每年在全市集中开展警示教育
  • 短剧植入,撬不动96.4%直男的钱包 | 调研报告
  • 90后青年学者李海增逝世9个月后文章登上顶刊,同仁缅怀其贡献
  • 购房成本再降低!今年首次降息落地,30年期百万房贷月供将减少54元
  • 凤阳县鼓楼四周连夜搭起围挡,安徽省文物局已介入调查