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

网站建设服务代理用py做网站

网站建设服务代理,用py做网站,杭州企业seo网站优化,新浪云 建设网站文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityopera… 文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 迭代器迭代器获取函数 构造函数默认构造使用n个值构造迭代器区间构造解决迭代器区间构造和用n个值构造的冲突拷贝构造 析构函数swap【交换函数】赋值运算符重载emptysize和capacityoperator[]reserve【调整容量大小】resize【调整size大小】push_backassign【把所有数据替换成迭代器区间中的数据】insert为什么扩容会导致pos迭代器失效为什么要返回pos-1 erase为什么要返回pos 全部代码 全部的实现代码放在了文章末尾 准备工作 创建两个文件一个头文件myvector.hpp一个源文件 tesr.cpp 【因为模板的声明和定义不能分处于不同的文件中所以把成员函数的声明和定义放在了同一个文件myvector.hpp中】 mystring.h存放包含的头文件命名空间的定义成员函数和命名空间中的函数的定义 test.cpp存放main函数以及测试代码 包含头文件 iostream用于输入输出 assert.h用于使用报错函数assert 定义命名空间和类 在文件myvector.hpp中定义上一个命名空间myvector 把vector类和它的成员函数放进命名空间封装起来防止与包含的头文件中的函数/变量重名的冲突问题 类的成员变量 参考了stl源码中的vector的实现 成员变量有3个都是迭代器 画图理解一下 迭代器 迭代器 因为存放数据的空间是从堆区申请的连续的内存且只是简单模拟 所以我用了指针T*作为普通迭代器const T*作为const迭代器 【T是vector中存储的数据的类型】 直接把T*重命名为iterator把const T*重命名为const_iterator就完成了迭代器的实现 迭代器获取函数 因为const修饰的对象只能调用const修饰的成员函数 所以如果是const修饰的对象调用begin()和end()的时候就会自动调用到const修饰的begin和end. 构造函数 默认构造 因为stl库里实现的默认构造是没开空间的所以默认构造直接让3个成员变量都为nullptr就行 直接在声明的时候给缺省值缺省值会传给成员初始化列表 即 而成员初始化列表会比构造函数先调用 并且每个构造函数调用之前都会先调用成员初始化列表这样不管调用哪一个构造函数初始化都会先把3个成员变量初始化成nullptr 使用n个值构造 迭代器区间构造 解决迭代器区间构造和用n个值构造的冲突 当重载了迭代器区间构造和用n个值构造的时候 如果传入的两个参数都是int类型的话就会报错 为什么 因为在模板函数构成重载时编译器会调用更合适的那一个 什么叫更合适 就是不会类型转 如果传入的两个参数都是int类型那么调用的应该是使用n个值构造因为没有int类型的迭代器 但是使用n个值构造的第一个参数是size_t,int传进去要隐式类型转换 而调用迭代器区间构造两个int的实参传进去就会直接把InputIterator推导成int不会发生类型转换所以编译器会调用迭代器区间构造 解决方法 再重载一个使用n个值构造的函数把第一个参数改成int 拷贝构造 因为成员申请了堆区空间所以要深拷贝 【不知道什么是深拷贝的可以看我这篇文章类和对象【三】析构函数和拷贝构造函数】 析构函数 swap【交换函数】 因为存放数据的空间是在堆区开辟的用3个成员变量去指向的 所以直接交换两个对象的成员变量就可以了 不需要拷贝数据 赋值运算符重载 因为成员申请了堆区空间所以要深拷贝 【不知道什么是深拷贝的可以看我这篇文章类和对象【三】析构函数和拷贝构造函数】 为什么上面的两句代码就可以完成深拷贝呢 这是因为 使用了传值传参会在传参之前调用拷贝构造再把拷贝构造出的临时对象作为参数传递进去 赋值运算符的左操作数*this再与传入的临时对象obj交换就直接完成了拷贝 在函数结束之后存储在栈区的obj再函数结束之后obj生命周期结束 obj调用析构函数把指向的从*this那里交换来的不需要的空间销毁 empty size和capacity operator[] 因为 const修饰的对象只能调用const修饰的成员函数 所以const对象只会调用下面的那个重载 reserve【调整容量大小】 resize【调整size大小】 push_back assign【把所有数据替换成迭代器区间中的数据】 insert iterator insert(iterator pos, const T val){assert(pos _finish); 防止插入的位置是 越界的if (_finish _end_of_storage) 如果容量满了{记录一下扩容前的pos与start的相对位置因为扩容的话会导致pos迭代器失效size_t n pos-_start;if (capacity() 0) 如果容量为0reserve(2);else 容量不为0就扩2倍reserve(capacity() * 2);更新pospos _start n;}iterator it end()-1;把pos及其之后的数据向后挪动一位while (it pos){*(it 1) *it;it--;}_finish;*pos val;插入数据返回指向新插入的数据的迭代器 用于处理迭代器失效问题return pos-1;}为什么扩容会导致pos迭代器失效 因为扩容之后原来的空间被释放了 又因为使用的扩容方式是reserve所以那3个成员变量的值扩容后可以指向正确的位置。 但是pos如果不更新的话就还是指向被释放的空间就成了野指针了。 更新方法也很简单保存扩容之前的pos与start的相对距离n扩容之后再让pos_startn就可以了。 为什么要返回pos-1 这是stl库里面处理迭代器失效的方法之一 因为我们在使用stl库里面的insert函数的时候是不知道什么时候会扩容的【每个平台实现的vector是不同的】 只能默认使用了之后传进去pos在调用一次insert之后就失效了失效的迭代器是不能使用的。 所以如果还要用pos就要把它更新一下stl库里提供的更新方式就是 让pos接收insert的返回值。【pos是传值调用形参改变不影响实参】并且规定insert的返回值要是指向新插入的数据的迭代器 erase 为什么要返回pos 因为使用了erase之后的迭代器也会失效需要提供更新的方法 为什么使用了erase之后的迭代器会失效 不确定是否删除到一定数据时会不会减小容量以适应size 此时和insert的一样因为不能部分释放所以会把原来的空间释放掉申请新空间不确定是否删除的是最后一个数据如果是那么调用完erase之后pos指向的就 不是vector的有效数据范围了 所以和insert一样调用了erase之后如果还要使用pos就要接收返回值。 stl库里面规定erase的返回值是指向删除数据的下一个数据的迭代器因为挪动覆盖的原因下一个数据就是pos指向的数据所以返回pos【没有接收返回值的迭代器在检测较严格的编译器中不管指向的位置是否正确都会禁止使用使用了就报错】 全部代码 #includeiostream #includeassert.husing namespace std;namespace myvector {templateclass Tclass vector{public:typedef T* iterator;typedef const T* const_iterator;vector(){}vector(size_t n,const T valT()){_start new T[n];//从堆区可容纳申请n个元素大小的空间_finish _start;//还没有 有效数据 时start与finish重合_end_of_storage _start n;//指向最大容量 的 下一个位置for (size_t i 0; i n; i)//循环n次{push_back(val);//把数据尾插进去}}vector(int n, const T val T()){_start new T[n];_finish _start;_end_of_storage _start n;for (size_t i 0; i n; i){push_back(val);}}templateclass InputIteratorvector(InputIterator first, InputIterator last){//使用迭代器进行循环while (first ! last){push_back(*first);//把数据尾插进去first;}}void swap(vectorT obj){//使用库里面的swap交换3个成员变量std::swap(_start, obj._start);std::swap(_finish, obj._finish);std::swap(_end_of_storage, obj._end_of_storage);}vector(const vectorT obj){size_t size obj.size();//记录有效数据个数size_t capacity obj.capacity();//记录容量大小_start new T[capacity];//申请与obj相同大小的空间_end_of_storage _start capacity;//指向最大容量 的 下一个位置for (size_t i 0; i size; i)//循环size次{_start[i] obj._start[i];//把有效数据拷贝过去}_finish _start size;//指向最后一个有效数据的 下一个 位置}~vector(){//释放从堆区申请的空间delete[] _start;//把3个成员变量 置空_start nullptr;_finish nullptr;_end_of_storage nullptr;}vectorT operator (vectorT obj){swap(obj);return *this;}bool empty() const{//如果size等于0就是空的return size() 0;}size_t size()const{//finish指向最后一个有效数据的 下一个//start指向第一个有效数据//两个指针相减就是 两个指针之间的 数据个数return _finish - _start;}size_t capacity()const{//end_of_storage指向最大容量的 下一个位置//start指向第一个有效数据//两个指针相减就是 两个指针之间的 数据个数return _end_of_storage - _start;}T operator[] (size_t n){//防止越界访问assert(n size());//因为start是T*类型所以可以像数组一样直接随机访问return _start[n];}const T operator[] (size_t n) const{//防止越界访问assert(n size());//因为start是T*类型所以可以像数组一样直接随机访问return _start[n];}iterator begin()//普通起始迭代器{return _start;}iterator end()// 普通结束迭代器{return _finish;}const_iterator begin()const//const起始迭代器{return _start;}const_iterator end()const//const结束迭代器{return _finish;}void reserve(size_t n){if (n capacity())//要调整的容量n大于capacity才扩容{size_t origsize size();//记录扩容前的sizeT* tmp new T[n];//申请空间//把原来的数据拷贝到 新空间for (size_t i 0; i origsize; i){tmp[i] _start[i];}delete[] _start;//释放旧空间//让成员变量指向 新的空间的相对位置_start tmp;_finish _start origsize;_end_of_storage _start n;}}void resize(size_t n, const T val T()){if (size() n)//如果size与要调整的n相等return;//直接返回else if (size() n)//如果size小于n{if (n capacity())//如果n大于capacity{reserve(n);//把容量调整到n}//再把size到n 之间的空间用 val填上for (size_t i size(); i n; i){push_back(val);}}else//如果size 大于 n{//就调整标识有效数据的末尾的finish//让size_finish - _start n_finish _start n;}}void push_back(const Tval){if (_end_of_storage nullptr)//如果容量为0{reserve(2);//把容量调整到可容纳 2个元素大小}else if (_finish_end_of_storage)//容量满了{reserve(capacity()*2);//扩容}//在下标为size【最后一个有效数据的下一个】//插入值_start[size()] val;_finish;//更新有效数据的末尾}void pop_back(){assret(size() 0);_finish--;}template class InputIteratorvoid assign(InputIterator first, InputIterator last){delete[] _start;//释放原来申请的空间//把3个成员变量置空_start nullptr;_finish nullptr;_end_of_storage nullptr;while (first ! last){//一个一个尾插进去push_back(*first);first;}}iterator insert(iterator pos, const T val){assert(pos _finish);//防止插入的位置是 越界的if (_finish _end_of_storage)//如果容量满了{//记录一下扩容前的pos与start的相对位置//因为扩容的话会导致pos迭代器失效size_t n pos-_start;if (capacity() 0)//如果容量为0reserve(2);else//容量不为0就扩2倍reserve(capacity() * 2);//更新pospos _start n;}iterator it end()-1;//把pos及其之后的数据向后挪动一位while (it pos){*(it 1) *it;it--;}_finish;*pos val;//插入数据return pos-1;}template class InputIteratorvoid insert(iterator pos, InputIterator first, InputIterator last){assert(pos _finish);size_t len 0;InputIterator in first;while (in ! last){in;len;}if (_finish len _end_of_storage){size_t n pos - _start;if (capacity() 0){reserve(len);}reserve(capacity()len);pos _start n;}iterator it end() - 1;while (it pos){*(it len) *it;it--;}_finishlen;it pos;while (it ! pos len){*it *first;it;first;}}iterator erase(iterator pos){// 防止传入的pos 是越界的assert(pos _finish);iterator it pos;//把pos之后的数据都向前挪动一位把pos指向的位置给覆盖掉while (it end()-1){*it *(it 1);it;}//更新数据末尾 迭代器_finish--;//返回posreturn pos;}iterator erase(iterator first, iterator last){assert(first begin());assert(last end());iterator fi first;iterator la last;size_t len last - first;while (la ! end()){*fi *la;fi;la;}_finish - len;return first;}private://start指向从堆区申请的空间的 起始 位置与begin()返回的迭代器相等//标识有效数组的开始iterator _start nullptr;//finish指向 最后一个有效数据的 下一个位置与end()返回的迭代器相等//标识有效数据的结束iterator _finish nullptr;//_end_of_storage指向从堆区申请的空间的 末尾的 下一个位置//标识容量iterator _end_of_storage nullptr;}; }
文章转载自:
http://www.morning.gjfym.cn.gov.cn.gjfym.cn
http://www.morning.gsksm.cn.gov.cn.gsksm.cn
http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn
http://www.morning.zycll.cn.gov.cn.zycll.cn
http://www.morning.bplqh.cn.gov.cn.bplqh.cn
http://www.morning.knngw.cn.gov.cn.knngw.cn
http://www.morning.mmhaoma.com.gov.cn.mmhaoma.com
http://www.morning.qxmys.cn.gov.cn.qxmys.cn
http://www.morning.hnhsym.cn.gov.cn.hnhsym.cn
http://www.morning.ztqj.cn.gov.cn.ztqj.cn
http://www.morning.pqcbx.cn.gov.cn.pqcbx.cn
http://www.morning.trtxt.cn.gov.cn.trtxt.cn
http://www.morning.rxxdk.cn.gov.cn.rxxdk.cn
http://www.morning.srtw.cn.gov.cn.srtw.cn
http://www.morning.jlxqx.cn.gov.cn.jlxqx.cn
http://www.morning.clkyw.cn.gov.cn.clkyw.cn
http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn
http://www.morning.qmnhw.cn.gov.cn.qmnhw.cn
http://www.morning.rbsmm.cn.gov.cn.rbsmm.cn
http://www.morning.ktqtf.cn.gov.cn.ktqtf.cn
http://www.morning.hdscx.cn.gov.cn.hdscx.cn
http://www.morning.rhsg.cn.gov.cn.rhsg.cn
http://www.morning.sblgt.cn.gov.cn.sblgt.cn
http://www.morning.svtxeu.com.gov.cn.svtxeu.com
http://www.morning.hsflq.cn.gov.cn.hsflq.cn
http://www.morning.zbqry.cn.gov.cn.zbqry.cn
http://www.morning.qmmfr.cn.gov.cn.qmmfr.cn
http://www.morning.rczrq.cn.gov.cn.rczrq.cn
http://www.morning.kehejia.com.gov.cn.kehejia.com
http://www.morning.wbnsf.cn.gov.cn.wbnsf.cn
http://www.morning.hqrkq.cn.gov.cn.hqrkq.cn
http://www.morning.qbrdg.cn.gov.cn.qbrdg.cn
http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn
http://www.morning.knqck.cn.gov.cn.knqck.cn
http://www.morning.jcfqg.cn.gov.cn.jcfqg.cn
http://www.morning.byywt.cn.gov.cn.byywt.cn
http://www.morning.kjlia.com.gov.cn.kjlia.com
http://www.morning.qdlnw.cn.gov.cn.qdlnw.cn
http://www.morning.ssrjt.cn.gov.cn.ssrjt.cn
http://www.morning.kgphd.cn.gov.cn.kgphd.cn
http://www.morning.yrck.cn.gov.cn.yrck.cn
http://www.morning.hcszr.cn.gov.cn.hcszr.cn
http://www.morning.rzmlc.cn.gov.cn.rzmlc.cn
http://www.morning.lmctj.cn.gov.cn.lmctj.cn
http://www.morning.cnwpb.cn.gov.cn.cnwpb.cn
http://www.morning.ykqbs.cn.gov.cn.ykqbs.cn
http://www.morning.xyyplp.cn.gov.cn.xyyplp.cn
http://www.morning.frxsl.cn.gov.cn.frxsl.cn
http://www.morning.wjndl.cn.gov.cn.wjndl.cn
http://www.morning.syssdz.cn.gov.cn.syssdz.cn
http://www.morning.litao7.cn.gov.cn.litao7.cn
http://www.morning.tgtwy.cn.gov.cn.tgtwy.cn
http://www.morning.fmqw.cn.gov.cn.fmqw.cn
http://www.morning.tgyqq.cn.gov.cn.tgyqq.cn
http://www.morning.zcwtl.cn.gov.cn.zcwtl.cn
http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn
http://www.morning.fsrtm.cn.gov.cn.fsrtm.cn
http://www.morning.mrlls.cn.gov.cn.mrlls.cn
http://www.morning.dlgjdg.cn.gov.cn.dlgjdg.cn
http://www.morning.gqhgl.cn.gov.cn.gqhgl.cn
http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn
http://www.morning.qtbnm.cn.gov.cn.qtbnm.cn
http://www.morning.fthqc.cn.gov.cn.fthqc.cn
http://www.morning.bqwrn.cn.gov.cn.bqwrn.cn
http://www.morning.mllmm.cn.gov.cn.mllmm.cn
http://www.morning.nbnq.cn.gov.cn.nbnq.cn
http://www.morning.wdhlc.cn.gov.cn.wdhlc.cn
http://www.morning.c-ae.cn.gov.cn.c-ae.cn
http://www.morning.mspqw.cn.gov.cn.mspqw.cn
http://www.morning.rbnp.cn.gov.cn.rbnp.cn
http://www.morning.pzrrq.cn.gov.cn.pzrrq.cn
http://www.morning.nuejun.com.gov.cn.nuejun.com
http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn
http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn
http://www.morning.szoptic.com.gov.cn.szoptic.com
http://www.morning.wrqw.cn.gov.cn.wrqw.cn
http://www.morning.kgslc.cn.gov.cn.kgslc.cn
http://www.morning.bqhlp.cn.gov.cn.bqhlp.cn
http://www.morning.tcpnp.cn.gov.cn.tcpnp.cn
http://www.morning.qbmpb.cn.gov.cn.qbmpb.cn
http://www.tj-hxxt.cn/news/241282.html

相关文章:

  • 徐州城乡建设局网站wordpress 文章h标签美化
  • 中国建设银行官方网站网上销售
  • 浙江企业响应式网站建设遵义北京网站建设
  • 网站建设万禾湖南盈达电力建设有限公网站
  • 教做美食的视频网站重庆网站建设公司有哪些内容
  • 江西企业网站建设哪家好加强网站建设和管理的通知
  • 怎么知道公司网站是哪个公司做的网站建设 青岛
  • 利用网站源代码建立网站临沂网站建设培训班
  • 台州网站制作怀柔做网站
  • 综合性外贸网站建设网站建设的具体奖罚措施
  • 天津电商网站建设做爰全过程免费的教网站
  • 网站建设 备案什么意思中国建筑招聘官网2022
  • 阿里云购买域名后怎么建网站搜索引擎案例分析结论
  • 宝安网站建设深圳信科公司官方网站建站
  • 免费个人网站模版下载溧水区城乡建设局网站
  • 网站优化锚文本链接之精髓火车头更新wordpress
  • 杭州智能模板建站建设企业官方网站官网
  • 网站备案如何申请美食分享网站怎么做
  • 沈阳高端网站html制作网页的代码
  • .net 企业网站源码下载开个公司做购物网站
  • 成都市建设厅官方网站望野王绩拼音
  • 广州网站建设商手机网站内容管理系统
  • 网站的风格主要包括韩国美食网站建设目的
  • 后浪 网站建设类上海网络关键词优化
  • 当今弹幕网站建设情况河北怎样做网站
  • 官方网站建设意义动漫制作就业方向及前景
  • 玩具租赁系统网站开发与实现我的网站怎么不能搜索
  • 微网站建设制作设计什么是关键词推广
  • 河北网站建设价格建设青岛公司网站
  • 做电子商务网站建设工资多少聊城大型门户网站建设