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

苏州网站运营公司建网站大公司

苏州网站运营公司,建网站大公司,摄影网站设计,WordPress编辑器高亮#x1f3ac;慕斯主页#xff1a;修仙—别有洞天 ♈️今日夜电波#xff1a;くちなしの言葉—みゆな 0:37━━━━━━️#x1f49f;──────── 5:28 #x1f504; ◀️ ⏸ ▶️ ☰… 慕斯主页修仙—别有洞天 ♈️今日夜电波くちなしの言葉—みゆな 0:37━━━━━━️──────── 5:28                                                                        ◀️   ⏸   ▶️    ☰  关注点赞收藏您的每一次鼓励都是对我莫大的支持 目录 一、vector实际的底层原理 二、vector的模拟实现 迭代器相关 基本操作迭代器失效问题 插入  删除  push_back pop_back swap 基本成员函数 构造函数 拷贝构造函数  析构函数  赋值运算符  空间管理 基本状态  扩容操作 resize  重载[ ]最爱的运算符 三、整体代码 一、vector实际的底层原理 C中的vector底层实现是一个动态数组也被称为可变数组。当向vector添加元素时如果数组已经被填满vector会自动创建一个更大的数组将原有数据复制到新数组中并将新元素添加到新数组中。这种自动扩容的机制使得vector能够封装任意数量的对象而不必关心底层的数组大小。 vector的成员变量同前面我们学的string不一样他是通过使用指针来控制起始位置、最后一个数据位置、最大容量位置。定义如下 class vector { public:typedef T* iterator;typedef const T* const_iterator; private:iterator _start; iterator _finish;iterator _endofstorage; }; 配合图解明白  二、vector的模拟实现 迭代器相关 // Vector的迭代器是一个原生指针typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;} 基本操作迭代器失效问题 插入  在插入元素期间可能会引起扩容让三个指针都指向新的空间原空间被释放从而导致原来的迭代器指向的空间错误对此我们可以返回新的空间的地址解决。 iterator insert(iterator pos, const T x)//迭代器失效返回新的迭代器解决{assert(pos _start);assert(pos finish);if (_finish _endOfStorage){size_t len pos - _start;//避免位置错误,因为在扩容后_start的地址会变化reserve(capacity() 0 ? 4 : capacity() * 2);pos start len;//恢复位置}iterator end _finish - 1;while (end pos)//从后往前挪{*(end 1) *end;--end;}*pos x;_finish;return pos;} 删除  删除由于受限制在这里实现的时候只能通过返回指针来控制删除。通常在使用 erase 进行删除时我们需要额外定义一个迭代器来接受原迭代器通过选择语句来进行批量删除的判断。有如下例子我们要删除迭代器中可以被2整除的数以此解决迭代器的问题 iterator erase(Iterator pos)//迭代器失效返回新的迭代器解决{assert(pos _start);assert(pos _finish);iterator it pos 1;//定义一个变量用于删除while (it _finish){*(it - 1) *it;it;}--_finish;return pos;} push_back 复用以上insert的操作简化代码 。 void push_back(const T x){/*if (_finish _endofstorage){reserve(capacity() 0 ? 4 : capacity() * 2);}*_finish x;_finish;*/insert(end(), x);} pop_back void pop_back(){assert(!empty());--_finish;} swap void swap(vectorT v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);} 基本成员函数 主要是复用上面的基本操作以此来简化代码。  构造函数 vector():_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){} 在构造时由于我们都要初始化。我们可以直接给成员变量在定义时就给缺省值剩下的两个分别是根据指定数量、指定初始化值以及根据迭代器构造。  vector(){}vector(int n, const T value T()){reserve(n);for (int i 0; i n; i){push_back(value);}}templateclass InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}拷贝构造函数  特别注意在进行拷贝构造时不要使用memcpy在对诸如string等类型进行拷贝时执行的是浅拷贝。我们在这复用push_back()来进行拷贝构造。 vector(const vectorT v){reserve(v.capacity());for (auto e : v){push_back(e);}} 析构函数  需要释放在堆上动态开辟的空间并且将指针置空防止野指针。 ~vector(){delete[] _start;_start _finish _endofstorage nullptr;} 赋值运算符  vectorT operator (vectorT v){swap(v);return *this;} 空间管理 基本状态  size_t capacity() const{return _endofstorage - _start;}size_t size() const{return _finish - _start;}bool empty()const{return size() 0;} 扩容操作 注意这里不能使用memcpy进行对原有数据的拷贝操作使用memcpy对于一些存储结构如string等所做的是浅拷贝的操作。对此使用会造成很多问题。 void reserve(size_t n){if (n capacity()){T* tmp new T[n];size_t sz size();if (_start){//memcpy(tmp, _start, sizeof(T) * sz)//这里用memcpy这里会导致string的vector出错浅拷贝问题for (size_t i 0; i sz; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start sz;_endOfStorage _start n;}} resize  如果要扩的空间(n)小于当前数据个数则截取数据。如果要扩的空间(n)大于当前数据个数则扩容。 void resize(size_t n, const T value T()){if (n size()){_finish _start n;}else{reserve(n);while (_finish _start n){*_finish val;_finish;}}} 重载[ ]最爱的运算符 T operator[](size_t pos){assert(pos size());return _start[pos];}const T operator[](size_t pos)const{assert(pos size());return _start[pos];} 三、整体代码 #pragma once #define _CRT_SECURE_NO_WARNINGS 01 #includeiostream using namespace std;namespace lt{templateclass Tclass vector{public:// Vector的迭代器是一个原生指针typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}// construct and destroyvector():_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){}vector(int n, const T value T()){reserve(n);for (int i 0; i n; i){push_back(value);}}templateclass InputIteratorvector(InputIterator first, InputIterator last){while (first ! last){push_back(*first);first;}}vector(const vectorT v){reserve(v.capacity());for (auto e : v){push_back(e);}}vectorT operator (vectorT v){swap(v);return *this;}~vector(){delete[] _start;_start _finish _endofstorage nullptr;}// capacitysize_t capacity() const{return _endofstorage - _start;}size_t size() const{return _finish - _start;}bool empty()const{return size() 0;}void reserve(size_t n){if (n capacity()){T* tmp new T[n];size_t sz size();if (_start){//memcpy(tmp, _start, sizeof(T) * sz)//这里用memcpy这里会导致string的vector出错浅拷贝问题for (size_t i 0; i sz; i){tmp[i] _start[i];}delete[] _start;}_start tmp;_finish _start sz;_endOfStorage _start n;}}void resize(size_t n, const T value T()){if (n size()){_finish _start n;}else{reserve(n);while (_finish _start n){*_finish val;_finish;}}}///access///T operator[](size_t pos){assert(pos size());return _start[pos];}const T operator[](size_t pos)const{assert(pos size());return _start[pos];}///modify/void push_back(const T x){/*if (_finish _endofstorage){reserve(capacity() 0 ? 4 : capacity() * 2);}*_finish x;_finish;*/insert(end(), x);}void pop_back(){assert(!empty());--_finish;}void swap(vectorT v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}iterator insert(iterator pos, const T x)//迭代器失效返回新的迭代器解决{assert(pos _start);assert(pos finish);if (_finish _endOfStorage){size_t len pos - _start;//避免位置错误,因为在扩容后_start的地址会变化reserve(capacity() 0 ? 4 : capacity() * 2);pos start len;//恢复位置}iterator end _finish - 1;while (end pos)//从后往前挪{*(end 1) *end;--end;}*pos x;_finish;}iterator erase(Iterator pos)//迭代器失效返回新的迭代器解决{assert(pos _start);assert(pos _finish);iterator it pos 1;//定义一个变量用于删除while (it _finish){*(it - 1) *it;it;}--_finish;return pos;}private:iterator _start nullptr; // 指向数据块的开始iterator _finish nullptr; // 指向有效数据的尾iterator _endOfStorage nullptr; // 指向存储容量的尾};}感谢你耐心的看到这里ღ( ´ᴗ )比心如有哪里有错误请踢一脚作者o(╥﹏╥)o  给个三连再走嘛~
http://www.hkea.cn/news/14290929/

相关文章:

  • 模板网站开发信阳建设企业网站
  • 桥西区网站建设南昌建网站做优化公司
  • 外贸自建网站北京做网站推广的公司
  • 十堰北京网站建设郑州网站建设网络公司
  • 外贸网站 开源wordpress使用端口
  • 原生态旅游网站开发需求分析长春企业网站建设价格
  • 校园网站怎么建网站建设首页步骤
  • 苏州网站建设的公司哪家好成都住建局官网住建智慧建管
  • 免费网站是wordpress 同步 朋友圈
  • 网站建设的书湛江网站模板
  • 手机能做网站吗找人做网站上线后被投诉侵权
  • 手机看网站做淘宝客需要建网站吗
  • 南通网站设计制作公司网站制作的基本流程是什么
  • 品牌的手机网站制作xampp可以做网站吗
  • 办个网站多少钱wordpress自助发货系统
  • 兼职建设网站rar在线解压缩网站
  • 网站方案模板怎么做自我介绍网站
  • 做旅游网站的论文大型的营销型网站建设
  • 简单的网站建设公司的模板下载网站全是乱码
  • 网站开发w亿玛酷1订制做产品封面的网站
  • 标准网站建设全球最顶尖的设计公司
  • 上海怎样做网站t型布局网站
  • 泉州市网站建设域名论坛网站
  • 登录全球最大的域名注册商网站网站建设合同 包括什么
  • 精品课程云网站建设营销型网站建设的一般过程包括哪些环节?
  • 下载搭建网站软件下载金华市开发区人才网
  • 茂名网站建设咨询公司网站代码模板下载
  • 做网站的去那里接单现在出入河南最新规定
  • wordpress博客站点地图开封seo公司
  • 网站界面设计要素在线域名ip查询