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

做虾网站该起啥名好wordpress 徽标

做虾网站该起啥名好,wordpress 徽标,凡科互动小游戏怎么刷高分,响应式网站 拖拽一、构造与析构 1.构造函数 构造函数需要尽可能将成员在初始化列表中初始化#xff0c;string类的成员这里自定义的和顺序表相似#xff0c;有_str , _size , _capacity , 以及一个静态成员 npos #xff0c;构造函数这里实现两种#xff0c;一种是传参为常量字符串的string类的成员这里自定义的和顺序表相似有_str , _size , _capacity , 以及一个静态成员 npos 构造函数这里实现两种一种是传参为常量字符串的一种是不进行传参直接实例化的这里可以使用缺省参数。 string(const char* str ):_size(strlen(str)){assert(str);_capacity _size 0 ? 3 : _size;//一开始时开多几个空间避免后续一些越界问题_str new char[_capacity1];//给多一个位置存放‘\0’strcpy(_str,str);} 2.拷贝构造 拷贝构造得注意参数给的时候要用引用传参不然会无限递归 string(const string s):_size(s._size),_capacity(s._capacity){_str new char[_capacity1];strcpy(_str,s._str);} 3.析构函数 正常用delete释放空间参数置空即可 ~string(){delete[] _str;_str nullptr;_size 0;_capacity 0;} 二、迭代器 1.正向迭代器 这里由于底层是顺序表因此迭代器的实现可以直接用指针需要注意的是在使用迭代器时有时候需要用到const修饰因此两种都要实现构成函数重载 typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str_size;} const_iterator begin()const{return _str;}const_iterator end()const{return _str_size;} 2.反向迭代器 反向迭代器的实现还没学暂时先空着... 三、基本参数返回 关于成员变量我们需要提供一些接口去给用户合理的访问部分参数 const char* c_str()const{return _str;}size_t size()const{return _size;}size_t capacity()const{return _capacity;} 四、增删查改 1.增加字符 关于增加字符这里模拟实现几个基本的接口 1reserve 在模拟实现增加字符前要先考虑扩容的问题可以先实现reserve后续对其进行复用扩容 void reserve(size_t n)//扩容{if(n _capacity){char* tmp new char[n1];strcpy(tmp,_str);delete[] _str;_str tmp;_capacity n;}} 2push_back void push_back(char ch){if(_size 1 _capacity){reserve(_capacity*2);}_str[_size] ch;_size;_str[_size] \0;} 3append void append(const char* s){size_t len strlen(s);if(_size len _capacity){reserve(_sizelen);}strcpy(_str_size,s);_size len;} 4resize resize改变size的大小当size改变后比原有的capacity大时会进行扩容但不会进行缩容resize除了改变大小还会在其余的空间里填上指定字符要是不给定字符则默认为‘\0’ void resize(size_t n,char ch \0){if(n _size){reserve(n);while(_size n){_str[_size] ch;}_str[_size] \0;}else{_size n;_str[_size] \0;}} 5insert 从指定位置pos插入字符或者字符串这里需要构成函数重载思路是用一个end从后往前的将数据依次往后挪不要漏掉‘\0’然后空出来的位置再进行插入在插入字符串时挪动数据那一块的判断相对复杂需要画图去对边界条件进行判断需要注意的是end的类型要定义成size_t为了避免整形提升还需要注意end0时不会变成-1所以需要避免让end小于0的情况也就是头插的情况需要额外加判断或者采用从前面往后搬数据end指向后面 void insert(size_t pos,char ch){assert(pos _size);size_t end _size1;if(_size 1 _capacity){reserve(_capacity*2);}while(end pos){_str[end] _str[end-1];end--;}_str[pos] ch;_size;} void insert(size_t pos,const char* s){assert(pos _size);size_t len strlen(s);if(_size len _capacity){reserve(_sizelen);}size_t end _size len;while(end poslen-1){_str[end] _str[end - len];end--;}strncpy(_strpos,s,len);_sizelen;} 2.删除字符 1erase npos-1但npos是无符号整形因此是整形的最大值函数功能是从指定位置往后删指定长度的数据若是不给长度则默认全删了删到‘\0’停下。 void erase(size_t pos,size_t len npos){assert(pos _size);size_t end pos;size_t count 0;while(end _size len){end;len--;count;}while(end _size){_str[pos] _str[end];}_size - count;}2clear 清除所有数据 void clear(){_size 0;_str[_size] \0;} 3.查找字符 1find 查找函数这里模拟实现一个接口要支持查找字符或者字符串返回相对应的下标需要构成函数重载 查找字符 size_t find(char ch,size_t pos 0){for(size_t i pos;i_size;i){if(_str[i] ch){return i;}}return npos;} 查找字符串 size_t find(const char* s,size_t pos 0){char* pstr strstr(_strpos,s);if(pstr nullptr){return npos;}return pstr - s;} 4.修改字符 修改操作可以通过删除添加实现实际价值不大因此没有专门的接口实现这里实现一个常用的交换操作比起库里面直接使用的swap这里省去了拷贝构造的过程效率上会高很多 1swap void swap(string s){std::swap(_str,s._str);std::swap(_size,s._size);std::swap(_capacity,s._capacity);} 五、运算符重载 1.常用运算符 char operator[](size_t pos)const{assert(pos _size);return _str[pos];}string operator(char ch){push_back(ch);return *this;}string operator(const char* s){append(s);return *this;}string operator(const string s){if(this ! s){char* tmp new char[s._capacity1];strcpy(tmp,s._str);delete[] _str;_str tmp;_size s._size;_capacity s._capacity;}return *this;}2.比较运算符 bool operator(const string s)const{return strcmp(_str,s._str) 0 ;}bool operator(const string s)const{return strcmp(_str,s._str) 0;}bool operator(const string s)const{return *this s || *this s;}bool operator(const string s)const{return !(*this s);}bool operator(const string s)const{return !(*this s); }bool operator!(const string s)const{return !(*this s);} 3.流重载 1输出重载 ostream operator(ostream out,const string s){for(size_t i 0;is.size();i){out s[i];}return out;} 2输入重载 输入重载需要注意字符串的截取如果直接用in截取则无法截取到空格和回车因此用借用in的内部接口get()而且为了避免多次扩容减低效率可以先开一个字符串数组将每次在缓存区内获取的字符存到字符串数组中当字符串满了或者是获取完字符后再一次性输入到string变量中 istream operator(istream in,string s){s.clear();char ch in.get();char tmp[100];size_t i 0;while(ch ! ch !\n){if(i100){tmp[i] ch;ch in.get();tmp[i] \0;}else{stmp;i 0;}}if(i ! 0){stmp;}return in;} 总结 本篇模拟实现了string的部分常用的基本接口从原理上去学习了string类的相关知识
http://www.pierceye.com/news/556300/

相关文章:

  • 网站建设企业哪家好乐清站在那儿
  • 网站建设公司人员配置做网站衡水
  • 成都网站建设939seo搜索优化软件
  • 企业网站建设哪家好seo检测
  • 网站建设的案例教程视频教程兴平市住房和城乡建设局门户网站
  • cps推广网站怎么制作网站图片不显示
  • 手机网站设计图尺寸网站里的课程配图怎么做
  • 网站建设贰金手指下拉贰拾烟台酒店网站建设
  • 哈尔滨建设工程信息网站青岛网络宣传
  • 阿里云网站建设部署与发布网站没备案怎么做淘宝客
  • 潍坊建设银行网站珠海新盈科技 网站建设
  • 金华金东区建设局网站wordpress打开乱码
  • 创建一个网站的条件有哪些网站建设知名
  • 网站目录管理模版昆明大型网站建设费用
  • 莆田高端网站建设wordpress 表情没反应
  • 深圳做网站推广哪家好传奇网站模板怎么做的吗
  • 石景山区网站建设网线制作方法及步骤
  • 做网站端口内容无法替换做微信公众号网站
  • 电商网站首页怎么制作做网站用什么语言高效
  • 广州自助建设网站平台天津做网站美工
  • js 捕获网站异常插件网站商城怎么做
  • 北辰网站开发淮北哪有做淘宝网站
  • 建设银行e路通网站室内设计师证需要学哪些课程
  • 舟山市建设信息港网站打不开如何建设一个收费的影视图文网站
  • 内蒙建设信息网站网页制作作品阐述
  • 天津网站seo策划服装定制项目计划书
  • 常州网站建设大全买奢侈品代工厂做的产品的网站名
  • 建设网站如入什么费网站建设体会doc
  • 不备案怎么做淘宝客网站吗深圳华强北新闻最新消息今天
  • 梅兰商贸网站开发设计外国网站在中国做推广