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

网站建设论文附录怎么写网站服务器有什么用

网站建设论文附录怎么写,网站服务器有什么用,火车头wordpress发布接口,wordpress批量删除图片目录 一、引言 二、自我实现 1.成员变量的读写 2.构造与析构 3.迭代器 4.插入字符或字符串 尾插 中间插入 5.删除字符或子字符串 6.查找字符或子串 7.获取子串 三、补充 一、引言 实现自己的 string 类是学习 C 语言和面向对象编程的一个好方法。通过编写一个简单的…目录 一、引言 二、自我实现 1.成员变量的读写 2.构造与析构 3.迭代器 4.插入字符或字符串 尾插 中间插入 5.删除字符或子字符串 6.查找字符或子串 7.获取子串 三、补充 一、引言 实现自己的 string 类是学习 C 语言和面向对象编程的一个好方法。通过编写一个简单的字符串类可以深入理解类的概念、内存管理、构造函数、析构函数等核心理念。理解了string类的底层逻辑之后会发现一些在上层看似复杂的操作在底层其实很简单。下面就让我们来实现一个自己的string类吧 二、自我实现 1.成员变量的读写 string是一个字符串类所以我们在定义成员变量的时候需要一个char类型的指针指向存放字符串的空间为了方便实现对字符串的操作以及内存的管理还需要定义两个整形变量一个表示字符串长度一个表示当前空间大小。 private:char* _str;size_t _size;size_t _capacity;}; 这里定义成私有成员变量所以还需要使变量可读 const char* c_str() const //const关键字进行函数重载表示const对象也可以调用不加则不行{return _str;}size_t size() const{return _size;} 这里的 const是一个关键字作用是对函数进行重载使其具有普通成员函数以及常量成员函数的双重身份如果没有常量成员函数那么常量对象就无法调用不带 const 修饰的成员函数这可能导致在使用常量对象时的一些限制和不便。 我们需要重载[]完成对指定位置的字符的读或写操作 char operator[](size_t pos) //引用返回返回值出了作用域任然存在可读可写{assert(pos _size);return _str[pos];}const char operator[](size_t pos) const //const对象调用这个只读{assert(pos _size);return _str[pos];}这里提供两个版本一个是普通成员函数一个是常量成员函数之所以要分开写是因为他们的返回值类型不同一个是可读可写一个是只读不可写。 2.构造与析构 默认构造函数 string(const char* str ) //全缺省常量字符串末尾默认\0:_size(strlen(str)),_capacity(_size),_str(new char[_capacity 1]){strcpy(_str, str);}其作用是创建一个 string 类对象该对象的内部包含一个动态分配的字符数组 _str存储了传入的 C 字符串的内容并且记录了字符串的长度 _size 和容量 _capacity。我们调用无参构造函数时 _str内部默认存在有字符 \0。\0 标记了字符串的末尾。 拷贝构造函数 string(const string s){_str new char[s._capacity 1];strcpy(_str, s._str);_size s._size;_capacity s._capacity;}这是一个字符串类的拷贝构造函数的实现。拷贝构造函数用于创建一个新的对象并以另一个同类型对象的内容为模板进行初始化。具体来说对于字符串类而言这段代码的作用是创建一个新的字符串对象并将其内容初始化为另一个字符串对象 s 的内容的副本。 这里的构造函数都是以深拷贝的方式实现新对象拥有一个新的内存块该内存块包含源对象或源字符串的副本。 析构函数 ~string(){delete[] _str;_str nullptr;_size _capacity 0;}析构函数无需多言需要注意的是 delete后面一定要加 []表示释放的是一个字符串的空间。 3.迭代器 string类提供了迭代器iterator来遍历字符串的元素迭代器是一种抽象的、通用的数据访问方式它可以被用于遍历不同类型的数据结构。在string中迭代器通常是一个指向字符的指针或类似指针的对象这里我们模拟实现的是指针类型的迭代器 //迭代器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;} begin() 和 end()分别返回指向字符串首元素以及尾元素的后一位由于返回值的不同普通成员函数与常量成员函数要分开写。 其实实现了迭代器也就实现了基于范围的for循环不信可以看看以下代码 #includeiostream using namespace std;#includestring.hvoid text_iterator() {bit::string a(Hello world!);bit::string::iterator it a.begin();while (it ! a.end()){cout *it;it;}cout endl;for (auto ch : a){cout ch;}cout endl; }int main() {text_iterator();return 0; } 此时输出结果是 看到了吗两个循环的结果是一样的我们没有做任何操作就实现了基于范围的for循环诶其实实现了迭代器之后第二个循环体与前一个循环体对编译器来看是一样的这是给编译器设计好的不需要我们进行多余的操作。 4.插入字符或字符串 在进行插入操作时我们要先判断字符串的空间大小如果插入的字符/字符串的长度大于所剩余的空间就需要进行扩容在string中reserve成员函数实现上述功能 //扩容void reserve(size_t n){if (n _capacity){char* tmp new char[n 1];strcpy(tmp, _str);delete[] _str;_str tmp;//可以直接指针复制令两者指向同一块空间_capacity n;}} 如果需要扩容我们的做法是开辟一块新的空间存放原字符串的副本并且对原字符串进行空间释放再进行指针复制令_str指向新开辟的那块空间。 尾插 接下来就可以进行尾部插入字符或字符串的操作了 //插入字符void push_back(char ch){if (_size _capacity){//2倍扩容reserve(_capacity 0 ? 4 : _capacity * 2);}_str[_size] ch;_size;_str[_size] \0;}插入字符时首先判断空间大小空间不足则进行2倍扩容要注意的是原字符串为空的情况此时就不是2倍扩容了而是给定一个初始大小的空间。插入一个字符不仅要对插入位置进行赋值还要将它的下一位置赋值为\0。 //插入字符串void append(const char* str){size_t len strlen(str);if (_size len _capacity){//至少扩容到_sizelenreserve(_size len);}strcpy(_str _size, str);_size len;}插入字符串的操作和插入字符类似。进行扩容操作之后用strcpy函数将要插入的字符串赋值到原字符串的末尾处。 我们在使用string类的时候经常会用到其重载后的操作其作用是直接在str后面插入字符或字符串很方便其实实现起来也很简单就是用到上述的插入函数 string operator(char ch){push_back(ch);return *this;}string operator(const char* str){append(str);return *this;}中间插入 在string类中insert函数用于在字符串的指定位置插入字符或字符串。 void insert(size_t pos, size_t n, char ch){assert(pos _size);if (_size n _capacity){//至少扩容到_sizenreserve(_size n);}//挪动数据size_t end _size;while (end pos end ! -1) //若pos为0呢end!-1{_str[end n] _str[end];--end;}for (size_t i 0; i n; i){_str[pos i] ch;}_size n;}void insert(size_t pos, const char* str){assert(pos _size);size_t len strlen(str);if (_size len _capacity){//至少扩容到_sizenreserve(_size len);}//挪动数据size_t end _size;while (end pos end ! -1) //若pos为0呢end!-1{_str[end len] _str[end];--end;}for (size_t i 0; i len; i){_str[pos i] str[i];}_size len;}同样要先判断空间大小进行扩容操作。然后要进行数据的挪动挪动的范围是pos到end位置挪动的距离是n。这里要注意一个特殊情况就是当pos为0时也就是要将字符串整体向后移动时标记当前挪动字符位置的变量end在对首字符挪动完之后其值会自减为-1但是end是一个无符号整形因此此时的-1会被解释为该无符号整数的最大可能值所以还有加上一个判断条件end ! -1。 5.删除字符或子字符串 在 string 类中erase 函数用于从字符串中删除字符或子字符串。 void erase(size_t pos, size_t len -1){assert(pos _size);if (len -1 || pos len _size){_str[pos] \0;_size pos;}else{size_t end pos len;while (end _size){_str[pos] _str[end];}_size - len;}}pos表示删除的起始位置len表示删除的字符串的长度len设置成缺省参数默认为最大值即pos位置后面的字符全删当poslen大于字符串长度时也是全删。全删很简单只要将pos位置赋值为\0就可以了。此外就是删除内部的子串了定义一个变量end用于标记要删除的子串的末尾将end后面的字符依次覆盖到pos后面的字符处即可完成删除操作。 6.查找字符或子串 string 类中的 find 函数用于在字符串中搜索子字符串或字符并返回第一次出现的位置 //找一个字符size_t find(char ch, size_t pos 0){for (size_t i pos; i _size; i){if (_str[i] ch){return i;}}return -1;}//找一个字符串size_t find(const char* str, size_t pos 0){const char* ptr strstr(_str,str);if (ptr){return ptr - _str;}else{return -1;}} 查找操作很容易实现只需要对字符串进行遍历需要说明的是查找字符串操作时用到的 strstr 函数C 标准库函数 strstr 在字符串 _str 中查找第一次出现的子字符串 str。strstr 返回一个指向匹配子字符串的指针如果未找到匹配项则返回 nullptr。 7.获取子串 在 string 类中substr 函数用于提取字符串的子串 //取子串string substr(size_t pos 0, size_t len -1){assert(pos _size);size_t n len;if (n -1 || pos n _size){n _size - pos;}string tmp;tmp.reserve(n);for (size_t i pos; i pos n; i){tmp _str[i];}return tmp;}pos表示子串的首元素位置len表示子串长度len同样设置成缺省参数缺省值为最大值即取的是pos后面的全部字符组成的子串。由于返回值类型是string类所以我们需要声明一个tmp对象用于存放子串的副本用重载后的操作符即可实现子串的复制。 三、补充 前面说到过在C中对于无符号整数类型-1 不是一个负数而是一个非常大的正整数。这是由于无符号整数类型不能表示负数因此用有符号整数的-1表示无符号整数时会被解释为该无符号整数的最大可能值。因此我在处理一些返回值情况时例如查找操作时没找到指定字符则返回-1这可能导致问题因为 size_t 是一个无符号整数类型而 -1 是有符号整数。在 C 中无符号整数和有符号整数之间的比较可能导致一些不直观的行为。 所以最好用std::string::npos来表示-1最大可能值的情况。npos需设置成静态成员变量 namespace Mystd {class string{public://...private:char* _str;size_t _size;size_t _capacity;static size_t npos;};size_t Mystd::string::npos -1; } 写文不易望多多支持~~
http://www.zqtcl.cn/news/715819/

相关文章:

  • 做宣传册从哪个网站找素材中文在线っと好きだっ
  • 国际物流东莞网站建设wap是什么意思的缩写
  • 传奇官网百度seo营销网站
  • 如何在导航网站上做链接上海建筑设计研究院
  • 微信营销软件网站建设推广链接
  • 美的集团网站建设方案书广汉做网站
  • 个人博客网站实验报告商标购买网站
  • 2020给个免费网站好人有好报做购物微信网站
  • 做淘宝客网站挣钱济南百度竞价代运营
  • 国外网站404错误页网站地址搜索
  • 做 暧视频在线观看网站北京安卓app开发公司
  • h5哪个网站可以做惠州+企业网站建设
  • 网站运营知识哪个网站可以做免费商业推广
  • 电脑做网站怎么解析域名河南郑州静默管理
  • 项目网站制作冯提莫斗鱼前在哪个网站做直播
  • 网站建设 思路wordpress 访问记录插件
  • 网站建设diyseo课程培训班费用
  • 舞蹈培训东莞网站建设做直播网站
  • app建设网站公司网站制作预算
  • 移动端网站如何开发市辖区郑州网站建设
  • 山东省双体系建设网站wordpress 帮助 主题
  • 手机怎么做三个视频网站网站建设协议一百互联
  • 创建一个网站一般步骤有哪些安徽软件定制开发
  • 网站建设平台协议书模板下载佳木斯建网站的
  • 部队网站建设招标二级域名注册平台
  • 做网站怎么调用栏目织梦搞笑图片网站源码
  • 开个小网站要怎么做南宁seo外包服务商
  • 济宁做网站的企业app网站开发学习
  • 哪个网站可以做危险化学品供求html静态网站作品
  • 豪圣建设项目管理网站创建网站的视频