C++ string现代写法
一、现代写法实现接口
首先是拷贝构造的现代写法的实现:
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现代写法相关推荐
- c++ string 另类写法
#include <string> #include <iostream> #include <stdio.h>using namespace std;int ma ...
- 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 ...
- pandas string
1.0.0之前使用object存储字符串 1.0.0之后使用StringDtype存储字符串,简写为'string' pd.Series(['a', 'b', 'c']) # 为了兼容性,默认仍以ob ...
- String 字符串之截取
package day06;import java.util.Scanner;public class Date03 {public static void main(String[] args) { ...
- JavaSE最新版(二)面向对象、String类、ArrayList
一.类和对象 1.定义 用来描述一类事物的类,专业叫做:javabean类.在javabean类中,是不写main方法的 在以前可以在测试类中创建javabean类的对象并进行赋值调用 public ...
- Json schema规范写法
简介 日常开发中,json数据格式经常会被用到,其简单易懂的写法(对人与计算机皆如此)以及其轻量级特性非常适用于网络间的数据传递.json数据格式与java对象会经常进行相互转换,本文探讨的是json ...
- Swift学习笔记-协议(Protocols)
1.0 翻译:geek5nan 校对:dabing1022 2.0 翻译:futantan 校对:小铁匠Linus 定稿:shanksyang 本页包含内容: 协议的语法(Protocol Synta ...
- 微软推出新逆天开源语言Bosque,告别 for 循环,提高开发效率!
拥抱开源的微软近日又为开发者带来好消息:在受 TypeScript 语法类型与 ML 和 Node/JavaScript 语义启发下,微软推出了全新的开源编程语言 Bosque. Bosque 创作者 ...
- android tv 悬浮窗口,android TV的自定义关机弹出框
关机的时候会走power的相关部分 首先我们监听power键的文件是在frameworks\base\services\core\java\com\android\server\policy\Phon ...
最新文章
- 完全虚拟化和半虚拟化区别
- Android清理设备内存具体完整演示样例(二)
- 雷林鹏分享:jQuery EasyUI 拖放 - 基本的拖动和放置
- MySql(四):备份与恢复
- field list什么意思_Redis:我这21个灵魂拷问你拿什么挡?
- inline-block的几个问题(还没解决)
- Layui图片上传限制一张的问题
- ubutun下虚拟环境的配置
- 云主机 环境搭配 交接文档
- 海康威视Linux下SDK开发(Ubuntu16.04 QT5.10)
- apache-ant-1.7 下载
- VTK四面体文件格式
- 使用Excel分析数据学习笔记之 二分类与混淆矩阵
- 最新青龙面板安装教程+依赖+拉库合集
- CSS颜色代码大全及a标签超链接颜色改变
- 栅格数据的三种存储格式--BSQ、BIL、BIP
- 292、Java中级09 - 【Lambda表达式】 2020.02.29
- burp与FoxyProxy抓包
- 华为云workerman超时ERR_CONNECTION_TIMED_OUT
- D19-读论文D19算法D19
热门文章
- python 英文关键词提取_python 利用jieba.analyse进行 关键词提取
- 外贸:Facebook养号攻略
- [css] 怎么自定义鼠标指针的图案?
- 马虎词汇教程31-35(转载)
- 全球游戏收入将随着电影电视改编作品的不断增多而达到惊人水平 | 美通社头条...
- 光滑曲线_微分几何笔记(4) —— 二维三维空间中曲线的曲率以及环绕数
- cad修改快捷键_CAD新手攻略:修剪(TRIM)CAD命令快捷键的使用技巧
- 说说自己工作中的测试流程
- C# 浅谈基于Wpf下的MVVM模式的设计思想
- 11.判断一个人出生了多少天