当前位置: 首页 > 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;};
} 

http://www.xdnf.cn/news/547849.html

相关文章:

  • 钉钉手机端应用访问提示: 钉钉授权码获取遇到了 “签名校验失败“ 的错误,钉钉开发文档有坑造成的
  • 青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布
  • 医学影像辅助诊断系统开发教程-基于tensorflow实现
  • CVE-2022-22978源码分析与漏洞复现
  • 实用 Git 学习工具推荐:Learn Git Branching
  • Mybatis的逆向工程Generator
  • 销售易史彦泽:从效率工具到增长引擎,AI加速CRM不断进化
  • SQL次日留存率计算精讲:自连接与多字段去重的深度应用
  • OpenCV 图像色彩空间转换
  • Yersinia:layer 2攻击框架!全参数详细教程!Kali Linux教程!
  • jieba分词
  • PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
  • 可视化图解算法42:寻找峰值
  • Cribl 中 Parser 扮演着重要的角色 + 例子
  • 鸿蒙HarmonyOS多设备流转:分布式的智能协同技术介绍
  • RustDesk CentOS自建中继节点
  • Linux 特权管理与安全——从启用 Root、Sudo 提权到禁用与防护的全景解析
  • WebRTC技术EasyRTC音视频实时通话驱动智能摄像头迈向多场景应用
  • 轻量级高性能推理引擎MNN 学习笔记 04.线性回归
  • C语言| 指针变量的初始化
  • OpenHarmony开源鸿蒙兼容性测试常见问题解答分享
  • 使用 Qt Designer 开发
  • [ARM][汇编] 02.ARM 汇编常用简单指令
  • HOW - 结合 AI 进行 Tailwind 样式开发
  • Secarmy Village: Grayhat Conference靶场
  • SpringMVC所有注解按照使用位置划分
  • 基于matlabcd7.x的无网格近似方法
  • CSS 样式表的四种应用方式详解以及css注释的应用
  • TypeScript与JavaScript的异同
  • MySQL:to many connections连接数过多