资讯专栏INFORMATION COLUMN

C++ string现代写法

jerry / 3071人阅读

摘要:宋体另一种写法宋体对传值操作,不传地址,这样对实参构不成影响,通过交换所指空间地址。楷体二现代写法其他接口实现宋体输入输出宋体字符串不能通过和输出的,而是通过调用和来操作单个字符来实现字符串的输入输出。

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

	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输出的,而是通过调用 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 ;        }}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123948.html

相关文章

  • C++入门string类常用接口函数介绍 + 进阶【模拟实现string接口函数】

    摘要:目录类对象的常见构造类对象的访问及遍历操作迭代器介绍类对象的修改操作深浅拷贝问题深拷贝传统写法深拷贝的现代写法模拟实现构造函数拷贝构造函数交换函数拷贝赋值运算符获取对象的成员属性重载可读可写和可读定义迭代器增容处理和函 ...

    legendaryedu 评论0 收藏0
  • [C/C++]详解STL容器1--string的功能和模拟实现(深浅拷贝问题)

    摘要:本文介绍了类的常用接口的使用,并对其进行了模拟实现,对模拟实现中涉及到的深浅拷贝问题进行了解析。在此之前,必须提到一个经典问题。为了解决浅拷贝问题,所以中引入了深拷贝。但是实际使用中需要是第一个形参对象,才能正常使用。 本文介绍了string类的常用接口的使用,并对其进行了模拟实现,对模拟实...

    tianren124 评论0 收藏0
  • 现代编程语言的值传递与引用传递

    摘要:在很多特性是和很类似,但是在类型系统中,同时支持值类型与引用类型。 现代编程语言对于值传递与引用传递的支持程度是比较不同的 首先介绍值传递与引用传递的概念 值传递 将变量a传递到其他的函数并对其更改,不能影响a的值 引用传递 在其他的作用域对传入的变量a的更改可以影响a的值 Note: ​ 在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,a; ​ 而对于动态内存...

    wenhai.he 评论0 收藏0
  • 现代编程语言的值传递与引用传递

    摘要:在很多特性是和很类似,但是在类型系统中,同时支持值类型与引用类型。 现代编程语言对于值传递与引用传递的支持程度是比较不同的 首先介绍值传递与引用传递的概念 值传递 将变量a传递到其他的函数并对其更改,不能影响a的值 引用传递 在其他的作用域对传入的变量a的更改可以影响a的值 Note: ​ 在这里的值的概念,对于原始类型,指的就是字面的值,如1,2,a; ​ 而对于动态内存...

    Anleb 评论0 收藏0
  • 【1】 pythonic modern c++:字符串

    摘要:我希望的是类似中文字符这样的使用体验。中文中文这里的遍历就类似中文中文我们这里干的事情类似于里两种类型的区分。 致力于在现代C++中提供Python的编程体验。这个建立在两个关键的基础上 c++ 11/14/17 提供了从 auto 到 structure binding 的语法便利 https://ericniebler.github.io... 提供的 range 抽象 但是 ...

    scwang90 评论0 收藏0

发表评论

0条评论

jerry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<