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

网站管理助手 二级域名免费空间asp网站

网站管理助手 二级域名,免费空间asp网站,新洲网站建设,株洲网站建设服务一、为什么要学习 string 类 C语言中#xff0c;字符串是以 “\0” 结尾的一些字符的集合#xff0c;为了操作方便#xff0c;C标准库中提供了一些 str 系列的库函数#xff0c;但是这些库函数与字符串是分离开的#xff0c;不太符合 OOP 的思想#xff0c;而且底层空间需…一、为什么要学习 string 类 C语言中字符串是以 “\0” 结尾的一些字符的集合为了操作方便C标准库中提供了一些 str 系列的库函数但是这些库函数与字符串是分离开的不太符合 OOP 的思想而且底层空间需要用户自己管理有可能会发生越界访问。 二、标准库中的 string 类 2.1 string 类了解 字符串是表示字符序列的类标准的字符串提供了对此类对象的支持其接口类似于标准字符容器的接口但是添加了专门用于操作单字节字符串的设计特性string 类是使用 char即作为他的字符类型使用他的默认 char_traits 和分配器类型string 类是 basic_string 模版类的一个实例他使用 char 来实例化 basic_string 模版类并用 char_traits 和 allocator 作为 basic_string 的默认参数注意这个类独立于所使用的编码来处理字节如果用来处理多字节或者变长字符如UTF-8的序列这个类的所有成员比如长度或者大小以及他的迭代器将仍然按照字节而不是实际编码的字符来操作。 总结 string 是表示字符串的字符串类该类的接口与常规容器的接口基本相同再添加了一些专门用来操作 string 的常规操作string 在底层实际上是basic_string 模版类的别名typedef basic_stringchar, char_traits, allocator string不能操作多字节或者变长字符的序列 2.2 string 类的常用接口说明 2.2.1 string 类对象的常见构造 constructor函数名称功能说明string()重点构造空的string类对象即空字符串string(const char* s)重点用C-string来构造string类对象string(size_t n, char c)string类对象中包含n个字符cstring(const string s)重点拷贝构造函数 void Teststring() {string s1; // 构造空的string类对象s1string s2(hello bit); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3 } 2.2.2 string 类对象的容量操作 函数名称功能说明size重点返回字符串有效字符长度length返回字符串有效字符长度capacity返回空间总大小empty重点检测字符串是否为空串是返回true不是返回falseclear重点清空有效数据reserve重点为字符串预留空间resize重点将有效字符的个数改为n个多出的空间用字符c填充 注意 size() 和length() 方法底层实现原理完全相同引入 size() 的原因是为了与其他容器的接口保持一致一般情况下基本都是使用 size()clear() 只是将 string 中的有效字符清空不改变底层空间的大小resize(size_t n) 与 resize(size_t n,char c) 都是将字符串中有效字符个数改变到 n 个不同的是当字符个数增多时resize(n) 用0填充多出的元素空间resize(size_t n, char c) 用字符c来填充多出的元素空间。注意resize 在改变元素个数时如果是将元素个数增多可能会改变底层容量的大小如果是将元素个数减少底层空间总大小不变reservesize_t res_arg 0) 为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserver不会改变容量大小  2.2.3 string 类对象的访问以及遍历操作 函数名称功能说明operator[]重点返回 pos 位置的字符const string 类对象调用begin endbegin 获取一个字符的迭代器 end 获取最后一个字符的迭代器rbegin rendrend 获取一个字符的迭代器 rbegin 获取最后一个字符的迭代器范围 forC11 支持更简洁的范围for的新遍历方式 2.2.4 string 类对象的修改操作 函数名称功能说明push_back在字符串末尾插入字符cappend在字符串后追加一个字符串operator 重点在字符串后追加字符串strc_str重点返回c格式的字符串find npos重点从字符串 pos 位置开始往后找字符c返回该字符在字符串中的位置rfind从字符串 pos 位置开始往前找字符c返回该字符在字符串中的位置substr在 str 中从 pos 位置开始截取 n 个字符然后将其返回 注意 在 string 尾部追加字符时s.push_back(c) / s.append(1, c) / s c 三种的实现方式差不多一般情况下 string 类的 操作用的比较多 操作不仅可以连接单个字符还可以连接字符串。对 string 进行操作时如果能够预估放多少字符可以先通过 reserve 把空间预留好。 2.2.5 string 类对象的非成员函数 函数名称功能说明operator尽量少用因为传值返回导致深拷贝效率低operator重点输入运算符重载operator重点输出运算符重载getline重点获取一行字符串relational operators重点大小比较 2.2.6 vs 和 g 下 string 结构的说明 注意下述结构是在32位平台下进行验证的32位平台下指针占4个字节  2.2.6.1 vs下的string结构 string 总共占28个字节内部结构稍微复杂一点先是有一个联合体俩呢体用来定义 string 中字符串的存储空间 当字符串长度小于16时使用内部固定的字符数组来存放当字符串长度大于等于16时从堆上开辟空间 union _Bxty { // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing } _Bx; 这样的设计是有一定的道理的大多数情况下字符串的长度都小于16那么 string 对象创建好之后内部已经有了16个字符数组的固定空间们不需要通过堆创建效率高。 其次还有一个 size_t 字段保存字符串长度一个 size_t 字段保存从堆上开辟空间总的容量。最后还有一个指针做一些其他事情。 故16 4 4 4 28个字节。 2.2.6.2 g下的string结构  g下string是通过写时拷贝实现的string对象总共占4个字节内部只包含了一个指针该指针将来指向一块堆空间内部包含了如下字段 空间总大小字符串有效长度引用计数指向堆空间的指针用来存储字符串  struct _Rep_base {size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount; }; 三、string 类的模拟实现 3.1 经典的string类问题 我们自己来模拟实现 string 类最主要是实现 string 类的构造拷贝构造赋值运算符重载以及析构函数。下面这个实现是有问题的 class String { public:/*String():_str(new char[1]){*_str \0;}*///String(const char* str \0) 错误示范//String(const char* str nullptr) 错误示范String(const char* str ){// 构造String类对象时如果传递nullptr指针可以认为程序非if (nullptr str){assert(false);return;}_str new char[strlen(str) 1];strcpy(_str, str);}~String(){if (_str){delete[] _str;_str nullptr;}} private:char* _str; };// 测试 void TestString() {String s1(hello bit!!!);String s2(s1); } 说明上述的string类没有显示定义其拷贝构造函数与赋值运算符重载此时编译器会合成默认的当使用 s1 构造 s2 时编译器会调用默认的拷贝构造。最终导致的问题是s1 和 s2 共用同一块内存空间在释放时同一块空间被释放多次而引起程序崩溃这种拷贝方式称为浅拷贝。  3.2 深拷贝和浅拷贝   3.2.1 浅拷贝 浅拷贝也称为位拷贝编译器只是将对象中的值拷贝过来。如果对象中管理资源最后就会导致多个对象共享同一份资源当一个对象销毁时就会将该资源释放掉但是此时另一个对象不知道该资源已经被释放掉以为还有效所以当继续对资源进行操作时就会发生了访问违规。 可以使用深拷贝解决浅拷贝问题即每一个对象都有一份独立的资源不要和其他对象共享。  3.2.2 深拷贝 如果一个类中涉及到资源的管理其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况下都是按照深拷贝方式提供的。 3.3 模拟 string 类 3.3.1 传统版写法 class String { public:String(const char* str ){// 构造String类对象时如果传递nullptr指针可以认为程序非if (nullptr str){assert(false);return;}_str new char[strlen(str) 1];strcpy(_str, str);}String(const String s): _str(new char[strlen(s._str) 1]){strcpy(_str, s._str);}String operator(const String s){if (this ! s){char* pStr new char[strlen(s._str) 1];strcpy(pStr, s._str);delete[] _str;_str pStr;}return *this;}~String(){if (_str){delete[] _str;_str nullptr;}}private:char* _str; }; 3.3.2 现代版写法 class String { public:String(const char* str ){if (nullptr str){assert(false);return;}_str new char[strlen(str) 1];strcpy(_str, str);}String(const String s): _str(nullptr){String strTmp(s._str);swap(_str, strTmp._str);}String operator(String s){swap(_str, s._str);return *this;}~String(){if (_str){delete[] _str;_str nullptr;}} private:char* _str; }; 3.4 写时拷贝 写时拷贝就是一种拖延症是在浅拷贝的基础上增加了引用计数的方式来实现的。 引用计数用来记录资源使用者的个数。在构造时将资源的计数给成1每增加一个对象使用该资源就给技术增加1当某一个对象被销毁时先给该计数减一然后再检查是否需要释放资源如果计数为1说明该对象时资源的最后一个使用者将该资源释放否则就不能释放因为还有其他对象在使用该资源。 STL的string类怎么了 面试中string的一种正确写法
http://www.hkea.cn/news/14394057/

相关文章:

  • 网站页面设计内容网络营销推广的目的
  • seo网站推广的主要目的包括网址导航网站简单制作
  • 柳州房地产网站建设杭州网站制作模板
  • 网站设计的设计方案找工作室的网站
  • 个人网页简历苏州做网站优化
  • 重庆网站建设培训机构学费网站开发 有哪些优化功能
  • 网站建设按什么合同交印花税中企动力优秀网站
  • 金华网站制作费用数字今天科技 网站
  • 温州网站建设方案托管网站开发需要哪些硬件
  • 网站的域名怎么起如何自己弄网站
  • 网站多少图片怎么做超链接佛山网站推广seo
  • 网站和网店的区别wordpress自定义目录
  • 阿里域名购买网站大连零基础网站建设教学公司
  • php 网站开发框架互联网建站是什么
  • 长春建站优化加徽信xiala5免费个人简历模板表格下载
  • 沈阳做招聘网站学生个人网页设计主题
  • 佛山网站优化湖北手机版建站系统哪家好
  • 网站开发 视频存在哪网站建设seo优化公司
  • 南宁专业网站建设公司wap网站建设方案
  • 怎样免费建企业网站查询域名注册信息
  • 织梦cms小说网站采集城阳建设局网站
  • 东莞建站模板大全徐州网站建设与推广
  • 如何让百度收录网站淮南微信网站建设
  • 有免费注册网站吗网站是怎么做优化
  • 容易收录的网站做网站找我们
  • 卦神岭做网站新网站建设一般多少钱
  • 怎么进入微信官方网站网站跟信息推广有哪些信息化建设
  • 凡科建站代理商登录百度推广客户端下载安装
  • 电子商务的网站建设的可用性收录优美图片app
  • 代刷网站只做软件吗网站建设与网页设计专业