一、现代写法实现接口
首先是拷贝构造的现代写法的实现:

 string_str(const string_str& st):str(nullptr){string_str tem(st.str);swap(this->str, tem.str);

首先先把this->str置空,temp调用构造函数,用st.str初始化this->str这样就形成一个临时对象,通过swap 然后把this->str和tem.str互换,这样两个对象指向的能存空间就互换了,出了作用域tem调用析构函数就释放了。这样就保证拷贝构造函数成功运行。
另一种写法:

string_str& operator=( string_str s) {swap(this->str, s.str);return *this;}

对s传值操作,不传地址,这样对实参构不成影响,通过swap交换所指空间地址。
operator=现代写法

// 对比下和上面的赋值那个实现比较好?
string& operator=(string s)
{swap(_str, s._str);
return *this;
}

这和拷贝构造另一种写法类似,对s传值操作,不传地址,这样对实参构不成影响,通过swap交换所指空间地址。
另一种实现方式:

/*
string& operator=(const string& s)
{
if(this != &s)
{
string strTmp(s);
swap(_str, strTmp._str);
}
return *this;
}
*/

同样的这和拷贝构造函数第一种实现方式类似。首先先把this->str置空,temp调用构造函数,用st.str初始化this->str这样就形成一个临时对象,通过swap 然后把this->str和tem.str互换,这样两个对象指向的能存空间就互换了,出了作用域tem调用析构函数就释放了。这样就保证拷贝构造函数成功运行。
二、 现代写法其他接口实现
输入输出:

 ostream& operator<<( string_str& str, ostream&out) {for (size_t i = 0; i < _size; i++) {out >> str[i];}return out;}istream& operator<<(string_str& str, istream& in) {str[0] = '\0';_size = 0;char ch;ch = in.get();while (ch != ' ' && ch != '\0'){str += ch;ch = in.get();}return in;}

字符串不能通过cout<<endl和cin>>endl输出的,而是通过调用 ostream& operator<<( string_str& str, ostream&out)和 istream&operator<<(string_str& str, istream& in)来操作单个字符来实现字符串的输入输出。
字符串的输出实际上是对字符串中的单个字符挨个遍历打印,
字符串的输入是对字符插入操作,遇到空格或者回车就会结束输入。

 istream& getline( string_str& str, istream& in) {str.clear();char ch;ch = in.get();while ( ch != '\0') {str += ch;ch = in.get();}return in;}

istream& getline( string_str& str, istream& in)
这个函数和operator>>底层基本相同只不过它只遇到换行结束输入。
插入与删除:

      void insert(size_t pos, char ch) {assert(pos >= 0 && pos <= _size);if (_size >= _capasity) {size_t num = _capasity == 0 ? 4 : 2 * _capasity;this->reserve(num);}int p = _size-1;/* for (size_t i = this->_size; i >= pos; i--) {this->str[i + 1] = this->str[i];}*/while (true) {this->str[p + 1] = this->str[p];p--;if (p < (int)pos) {break;}}this->_size++;this->str[pos] = ch;}void  insert(size_t pos,const char* str1) {assert(pos >= 0 && pos <= _size);size_t len = strlen(str1);if (_size + len > _capasity) {this->reserve(_size + len);}int p = _size - 1;/* for (size_t i = this->_size; i >= pos; i--) {this->str[i + 1] = this->str[i];}*/while (true) {this->str[p + len] = this->str[p];p--;if (p < (int)pos+len) {break;}}int j = 0;for (size_t i = pos; i < pos + len; i++) {str[i] = str1[j++];}_size += len;str[_size] = '\0';}

插入字符和字符串函数是函数重载,基本思想都是把pos位置到npos的字符串后移,插入字符只移动一位,而字符串姚移动len位接在在str[pos]插入ch,而字符串循环插入就行。

 void erase(size_t pos, int len = -1) {assert(pos < _size&& pos >= 0);if (len == -1|| pos + len >= _size) {str[pos] = '\0';_size = pos;}else {/*   int num = pos;while (true) {str[num] = str[num + len];num++;if (num + len == _size) {break;}}int p = _size - len;str[p] = '\0';_size = p;*/strcpy(str + pos, str + pos + len);int p = _size - len;str[p] = '\0';_size -= len;}}ostream& oper

字符串的删除分为两种情况;
1.len为npos或pos+len大于size这样在str[pos]插入\0就行了。
2.pos+len小于等于size把str + pos + len位置的字符串考到str + pos就可以了,str[pos]插入\0就OK了。
字符串比较:

int mystring::operator>(const mystring &s){return strcmp(p,s.p) ;
}int mystring::operator<(const char*s){return strcmp(p,s) ;
}int mystring::operator<(const mystring &s){return strcmp(p,s.p);
}int mystring::operator>(const char*s){return strcmp(p,s);
}bool mystring::operator!=(const mystring &s){if(!strcmp(p,s.p)){return false ;}return true ;
}bool mystring::operator!=(const char * s){if(p==NULL){if(len ==0)return false ;else{return true ;}}if(!strcmp(p,s)){return false ;}else{return true;}
}
bool mystring::operator==(const mystring&s){if(strcmp(s.p,p)==0){return true;}else{return false;}
}bool mystring::operator==(const char *s){if(s==NULL){if(len == 0){return true ;}else{return false ;}}if(strcmp(s,p)==0){return true ;}else{return false ;}
}

C++ string现代写法相关推荐

  1. c++ string 另类写法

    #include <string> #include <iostream> #include <stdio.h>using namespace std;int ma ...

  2. mybatis There is no getter for property named 'xx' in 'class java.lang.String

    用mybatis查询时,传入一个字符串传参数,且进行判断时,会报 Java代码   There is no getter for property named 'moduleCode' in 'cla ...

  3. pandas string

    1.0.0之前使用object存储字符串 1.0.0之后使用StringDtype存储字符串,简写为'string' pd.Series(['a', 'b', 'c']) # 为了兼容性,默认仍以ob ...

  4. String 字符串之截取

    package day06;import java.util.Scanner;public class Date03 {public static void main(String[] args) { ...

  5. JavaSE最新版(二)面向对象、String类、ArrayList

    一.类和对象 1.定义 用来描述一类事物的类,专业叫做:javabean类.在javabean类中,是不写main方法的 在以前可以在测试类中创建javabean类的对象并进行赋值调用 public ...

  6. Json schema规范写法

    简介 日常开发中,json数据格式经常会被用到,其简单易懂的写法(对人与计算机皆如此)以及其轻量级特性非常适用于网络间的数据传递.json数据格式与java对象会经常进行相互转换,本文探讨的是json ...

  7. Swift学习笔记-协议(Protocols)

    1.0 翻译:geek5nan 校对:dabing1022 2.0 翻译:futantan 校对:小铁匠Linus 定稿:shanksyang 本页包含内容: 协议的语法(Protocol Synta ...

  8. 微软推出新逆天开源语言Bosque,告别 for 循环,提高开发效率!

    拥抱开源的微软近日又为开发者带来好消息:在受 TypeScript 语法类型与 ML 和 Node/JavaScript 语义启发下,微软推出了全新的开源编程语言 Bosque. Bosque 创作者 ...

  9. android tv 悬浮窗口,android TV的自定义关机弹出框

    关机的时候会走power的相关部分 首先我们监听power键的文件是在frameworks\base\services\core\java\com\android\server\policy\Phon ...

最新文章

  1. 完全虚拟化和半虚拟化区别
  2. Android清理设备内存具体完整演示样例(二)
  3. 雷林鹏分享:jQuery EasyUI 拖放 - 基本的拖动和放置
  4. MySql(四):备份与恢复
  5. field list什么意思_Redis:我这21个灵魂拷问你拿什么挡?
  6. inline-block的几个问题(还没解决)
  7. Layui图片上传限制一张的问题
  8. ubutun下虚拟环境的配置
  9. 云主机 环境搭配 交接文档
  10. 海康威视Linux下SDK开发(Ubuntu16.04 QT5.10)
  11. apache-ant-1.7 下载
  12. VTK四面体文件格式
  13. 使用Excel分析数据学习笔记之 二分类与混淆矩阵
  14. 最新青龙面板安装教程+依赖+拉库合集
  15. CSS颜色代码大全及a标签超链接颜色改变
  16. 栅格数据的三种存储格式--BSQ、BIL、BIP
  17. 292、Java中级09 - 【Lambda表达式】 2020.02.29
  18. burp与FoxyProxy抓包
  19. 华为云workerman超时ERR_CONNECTION_TIMED_OUT
  20. D19-读论文D19算法D19

热门文章

  1. python 英文关键词提取_python 利用jieba.analyse进行 关键词提取
  2. 外贸:Facebook养号攻略
  3. [css] 怎么自定义鼠标指针的图案?
  4. 马虎词汇教程31-35(转载)
  5. 全球游戏收入将随着电影电视改编作品的不断增多而达到惊人水平 | 美通社头条...
  6. 光滑曲线_微分几何笔记(4) —— 二维三维空间中曲线的曲率以及环绕数
  7. cad修改快捷键_CAD新手攻略:修剪(TRIM)CAD命令快捷键的使用技巧
  8. 说说自己工作中的测试流程
  9. C# 浅谈基于Wpf下的MVVM模式的设计思想
  10. 11.判断一个人出生了多少天