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

做专业课视频课的网站frog 网站建设

做专业课视频课的网站,frog 网站建设,欧美风格外贸网站建设,成都市分类信息网站开发在C语言中#xff0c;string是一个标准库类#xff08;class#xff09;#xff0c;用于处理字符串#xff0c;它提供了一种更高级、更便捷的字符串操作方式#xff0c;string 类提供了一系列成员函数和重载运算符#xff0c;以便于对字符串进行操作和处理。 一、string…在C语言中string是一个标准库类class用于处理字符串它提供了一种更高级、更便捷的字符串操作方式string 类提供了一系列成员函数和重载运算符以便于对字符串进行操作和处理。 一、string类 在学习 string 前我们不妨先来了解一下 string 类到底是什么有什么用呢我们先来了解一下基本的概念吧 C标准库都是英语解释。我们也应该试着去适应不懂的可以查阅。当然在这里我就直接给出翻译主要是以下内容 字符串是表示字符序列的类 标准的字符串类提供了对此类对象的支持其接口类似于标准字符容器的接口但添加了专门用于操作单字节字符字符串的设计特性。 string类是使用char(即作为它的字符类型使用它的默认char_traits和分配器类型(关于模板的更多信息请参阅basic_string)。 string类是basic_string模板类的一个实例它使用char来实例化basic_string模板类并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。 注意这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列这个类的所有成员(如长度或大小)以及它的迭代器将仍然按照字节(而不是实际编码的字符)来操作。 二、string的常用见用法 2.1 string对象的构造 2.1.1 string对象的构造的使用方法 最为常用的无非就是我们用串string来构造一个对象也就是存储一个字符常用的方法有如下几点 string()——构造空的 string 类对象即空字符串 string(const char* s)——用 char* 来构造 string 类对象 string(size_t n, char c)——string类对象中包含n个字符c string(const strings)——拷贝构造函数。 下面是使用方法所对应的实例帮助更好的理解其用法。 三、string常用结构的底层实现 3.1 初建结构 我们通过上述的构造不难发现也不难理解string的底层其实就是一个字符指针该指针指向一个数组。当然我们还需要两个变量来维护其有效长度(_size)和数组容量(_capacity)。 其次我们自己实现的string类为了区分std命名空间我们可自己设置一个命名空间。处型的模拟实现如下 namespace gtm {class string{public://string()// :_str(new char[1])// , _size(0)// ,_capacity(0)//{//}//string(const char* str)// :_str(new char[strlen(str) 1]) //三次strlen函数效率低。// ,_size(strlen(str))// ,_capacity(strlen(str))//{// strcpy(_str, str);//}// 不再使用strlen函数初始化列表与变量声明顺序固定string(const char* str ) //默认空串。注意空串是以 \0 结尾{_size strlen(str);_capacity _size;_str new char[_size 1];strcpy(_str, str);}~string(){delete[] _str;_str nullptr;_size _capacity 0;}private:char* _str;size_t _size;size_t _capacity;}; 3.2 返回大小和容量 这两个部分是比较容易实现的两部分。同时也是较为常用的两部分。具体如下 size_t size() const{return _size;}size_t capacity() const{return _capacity;} 3.3 拷贝构造和赋值重载 这两部分较为复杂的两部分。其中均需要深拷贝去实现完成而浅拷贝是不可以的。注意拷贝构造使用一个已定义变量去初始化另一个变量赋值重载是两个已定义变量进行赋值。 具体实现如下 //深拷贝//string(const string s)// :_str(new char[s._capacity1])// ,_size(s._size)// ,_capacity(s._capacity)//{// strcpy(_str, s._str);//}void swap(string tmp){//调用全局的swap::swap(_str, tmp._str);::swap(_size, tmp._size);::swap(_capacity, tmp._capacity);}//借助变量tmpstring(const string s):_str(nullptr) , _size(0), _capacity(0){string tmp(s._str);swap(tmp);}//赋值//string operator(const string s)//{// if(this s)// {// return *this;// }// //先开空间拷贝数据以防new失败销毁原来的空间// char* tmp new char[s._capacity 1];// strcpy(tmp, s._str);// delete[] _str;// _str tmp;// _size s._size;// _capacity s._capacity;// return *this;// //delete[] _str;// //_str new char[s._capacity 1];// //strcpy(_str, s._str);// //_size s._size;// //_capacity s._capacity;// return *this;//}//string operator(const string s)//{// if(this s)// {// return *this;// }// string tmp(s._str);// swap(tmp);// return *this;//}string operator(string s){if (this s){return *this;}swap(s);return *this;} 上述的辅助重载我们巧妙地借助了临时变量s。当赋值完成后出了作用域s会自动调用戏后进行销毁这里是需要反复理解的。 3.4 扩容reserve 我们可简单的理解reserve为扩容扩容的前提为要求的容量比原来的大但是我们要记得把字符数组中原有的内容拷贝过来并且释放之前所动态开辟的空间。 具体实现如下 void reserve(size_t capacity){if (capacity _capacity){char* tmp new char[capacity 1];strcpy(tmp, _str);delete[] _str;_str tmp;_capacity capacity;}} 3.5 插入push_back、append、operator、insert 插入的实现主要的点就是是否要进行扩容。其次当我们实现push_back和append后其他的均可复用这两个结构进行实现。具体实现如下 void push_back(char ch){if (_size _capacity){reserve(_capacity 0 ? 4 : _capacity * 2);}_str[_size] ch;_size;_str[_size] \0;}void append(const char* str){size_t len strlen(str);if (len _size _capacity){reserve(len _size _capacity * 2 ? len _size : _capacity * 2);}strcpy(_str _size, str);_size len;}void append(const string s){append(s._str);}void append(int n, char ch){reserve(_size n);for (int i 0; i n; i){push_back(ch);}}string operator (char ch){push_back(ch);return *this;}string operator (const char* str){append(str);return *this;}string insert(size_t pos, char ch){assert(pos _size);if (_size _capacity){reserve(_capacity 0 ? 4 : _capacity * 2);}//注意当运算数一个是有符号另一个是无符号时有符号的运算数会强制类型转换为无符号数。pos等于0的位置插入end--后为超大数据会出错。//int end _size;//while (end (int)pos)//{// _str[end 1] _str[end];// end--;//}size_t end _size1;while (end pos){_str[end] _str[end - 1];end--;}_str[pos] ch;_size;return *this;}string insert(size_t pos, const char* str){assert(pos _size);size_t len strlen(str);if (len _size _capacity){reserve(len _size _capacity * 2 ? len _size : _capacity * 2);}size_t end _size len;while (end poslen){_str[end] _str[end - len];end--;}for (int i pos,j0; j len;j, i){_str[i] str[j];}_size len;return *this;} string 在C中算是比较重要的了也是入门时必须所学的容器。在平常中使用的频率较高所以我们不仅要掌握其简单的用法更应该去了解其底层的实现。这有助于我们后续的使用和理解。本篇文章列举出了string中常用的语法和接口底层的底层实现这些都是我们应该熟练掌握的内容。
http://www.ihoyoo.com/news/120595.html

相关文章:

  • 创建网站要申请域名吗淘宝客网站如何备案
  • 犀牛云做网站怎么这么贵怎么自己弄一个平台
  • 带后台的网站模板下载天津狐臭在哪里做津门网站I
  • 跟网站开发有关的内容有什么网站是layui做的
  • 网站管理助手4.0 破解阿里云智能logo设计网站
  • 国际网站建设的目的科技公司图片
  • 东莞销售网站建设网站建设与建设
  • 网站建设科邓州网络推广有效的方法
  • 网站新闻公告表怎么做公司官网首页设计
  • php彩票网站开发做外贸常用的网站有哪些
  • 济南快速网站制作公司怎样在百度能搜到自己的网站
  • 用什么软件来建网站推广专员是做什么的
  • 深圳门窗在哪里网站做推广网站建设的图片
  • 培训行业网站建设的重要性wordpress页面顶部菜单
  • 卓航网站开发微信运营服务商
  • 建立网站不公开好搜网
  • 林州网站建设服务江苏建设人才
  • 杭州网站建设哪家快速上线建设网站注意哪几点
  • 电子商务网站建设管理答案兰州需要做推广的公司
  • 法律行业网站建设饮食网站首页页面
  • 专门做字体设计的网站信阳网站建设制作公司
  • @安徽网站建设成都手机模板建站
  • 怎样用腾讯云做网站创业平台有哪些
  • 做网站用新域名还是老域名wordpress可以建官网嘛
  • p2p倒闭 网站开发百度世界500强排名
  • 关键词推广技巧浙江网站建设方案优化
  • 上海十大网站建晋江网络推广公司
  • 网站建设模块需求重庆网站建设软件
  • 广州天河区网站建设手机软件开发工程师
  • PHP长沙WordPress企业免费网站优化服务