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

6.string的模拟实现(三)

一.流提取实现补充

原来的实现:

istream& operator>> (istream& is, string& str){str.clear();char ch = is.get();while (ch != ' ' && ch != '\n'){str += ch;ch = is.get();}return is;}

我们不难发现,我们一直慢慢的get(),但是,进行插入的时候,大多数时候会进行扩容(有资源的消耗)

istream& operator>> (istream& is, string& str){str.clear();char buff[128];int i = 0;char ch = is.get();while (ch != ' ' && ch != '\n'){buff[i++] = ch;if(i == 127){buff[i] = '\0';str += buff;i = 0;}ch = is.get();}if(i != 0){buff[i] = '\0';str += buff;}return is;}

我们这里开128个字节的buff数组,等到了128个字节的时候,我们才进行一次性加到str上面,

这样就减少了扩容的消耗

二.拷贝的写法补充

// s2(s1)// 传统写法// string::string(const string& s)// {// 	_str = new char[s._capacity + 1];// 	strcpy(_str, s._str);// 	_size = s._size;// 	_capacity = s._capacity;// }// 现代写法string::string(const string& s){string tmp(s._str);std::swap(tmp._str,_str);std::swap(tmp._size,_size);std::swap(tmp._capacity,_capacity);}

// s2(s1)// 传统写法// string::string(const string& s)// {// 	_str = new char[s._capacity + 1];// 	strcpy(_str, s._str);// 	_size = s._size;// 	_capacity = s._capacity;// }// 现代写法string::string(const string& s){string tmp(s._str);// std::swap(tmp._str,_str);// std::swap(tmp._size,_size);// std::swap(tmp._capacity,_capacity);swap(tmp);}

又因为我们重新进行写了swap,所以我们可以进行直接调用

三.赋值的写法补充

// s1 = s3// s1 = s1// string& string::operator=(const string& s)// {// 	if (this != &s)// 	{// 		char* tmp = new char[s._capacity + 1];// 		strcpy(tmp, s._str);// 		delete[] _str;// 		_str = tmp;// 		_size = s._size;// 		_capacity = s._capacity;// 	}// 	return *this;// }string& string::operator=(const string& s){if (this != &s){string tmp(s);swap(tmp);}return *this;}

还有一个更简单的写法:

string& string::operator=(string tmp){swap(tmp);return *this;}

效率上面没有提升,只是没有自己干这个事情

四.写时拷贝

https://coolshell.cn/articles/12199.html  (写时拷贝)

https://coolshell.cn/articles/10478.html  (面试时怎么写string类)

这个引用计数的写时拷贝,有什么用呢?

Linux下的string的设计方案就是这样的

C++中(在流运算符下  c_str() 是打不出地址的,只能用(void*)s1.c_str());

C++后续增加了右值引用移动语义就没什么意义了

http://www.dtcms.com/a/482033.html

相关文章:

  • AQS 为什么采用抽象类(abstract class)而不是接口(interface)实现?
  • stable-diffusion-webui / stable-diffusion-webui-forge部署
  • 阿里云和聚名网的域名注册安全性如何?
  • 别让链表兜圈子——力扣141.环形链表
  • 济南网站推广公司做二手网站的用意
  • 专业的汽车媒体发稿怎么选
  • 事务消息(Transactional Message)
  • 北京网站开发周期专业的传媒行业网站开发
  • 高频使用RocksDB DeleteRange引起的问题及优化
  • for是什么意思?从foreign、forest谈起
  • 网站开发设计工程师网上注册公司申请入口
  • ARM 总线技术 —— AHB
  • .NET 程序自动更新的回忆总结
  • 自然语言处理笔记
  • 通州网站建设如何做信用网站截图
  • 网站空间控制网络服务采购
  • 方法合集——第七章
  • 定制衣柜厂柔性生产:客户需求拆解、板材切割与组装工序协同路径
  • 厦门外贸网站建设 之家wordpress菜单与顶部互换
  • openrewrite 的rewrite.yml 编写注意事项
  • 系统架构的平衡之道
  • 考研10.2笔记
  • Linux:传输层协议
  • 北京做网站建设的公司有哪些优化网站哪个好
  • 搭建网站工具抚州公司做网站
  • RK3588 + 银河麒麟部署 swarm 集群指南-续(自己应用程序部署)
  • 为什么我选择用 Rust 构建全栈后台管理系统?
  • 一篇文章讲清 UPD协议 与 TCP协议
  • 武邑网站建设价格wordpress 8小时
  • SSM高校职称申报系统337gs(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。