博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String深拷贝、比较及增删查改等操作
阅读量:4031 次
发布时间:2019-05-24

本文共 4421 字,大约阅读时间需要 14 分钟。

    string类是c++默认提供的,但是了解string类的写法也是非常重要的,面试中有许多关于string类的题目,string类能够考察c++类和对象的掌握程度,一定程度上也考察了面试者的编程能力。

    下面是string类的一些基本功能,由于面试的时间很短,在这极短的时间内全部实现string类的功能是不可能的,我们可以实现最基本的功能,类中的构造函数、析构函数、赋值,复制等功能。

#include
using namespace std;#include
class String{public: //构造函数 String(char* str = "")//对于string s;用""表示空 :_str(new char[strlen(str) + 1])//+1,针对空字符串开辟空间 { strcpy(_str, str); _size = strlen(str); _capacity = _size; } String(const String& s); String& operator=(String& s); ~String(); void Display();public: //实现增删查改及比较大小 char& operator[](size_t index);//更改字符 bool operator==(const String& s);//比较两个字符串是否相等 int compare(const String& s);//比较字符串大小 void CheckCapacity(size_t size);//检查容量 void PushBack(char ch);//尾插字符 void PopBack();//尾删字符 void Insert(size_t pos, const char ch);//插入字符 void InsertS(size_t pos, const char* ch,size_t len);//插入字符串中len个字符 void Erase(size_t pos,size_t len);//删除pos后len个字符 int Find(const char ch);//查找字符,返回位置 int FindS(const char* ch);//查找字符串private: char* _str; size_t _size; size_t _capacity;};//深拷贝的现代写法String::String(const String& s)    :_str(NULL)//防止释放有随机值的空间出错{ char* tmp = s._str; swap(_str, tmp); _size = s._size; _capacity = s._size;}String& String::operator = (String& s){ if (_str != s._str) { swap(_str, s._str); } return *this;}String::~String()//析构{ if (_str) { delete[] _str; _str = NULL; _size = 0; _capacity = 0; }}char& String::operator[](size_t index)//更改字符{ return _str[index];}bool String::operator==(const String& s)//比较两个字符串是否相等{//重新定义char* cur和tmp,防止被改变,造成析构崩溃 char* cur = _str; char* tmp = s._str; while (cur && tmp) { if (*cur != *tmp) { return 0; } else { ++cur; ++tmp; if (*cur == NULL && *tmp == NULL) return 1; } } return 0;}int String::compare(const String& s)//比较字符串大小{ char* cur = _str; char* tmp = s._str; while (cur && tmp) { if (*cur != *tmp) { return *cur - *tmp; } else { ++cur; ++tmp; if (*cur == NULL && *tmp == NULL) return 0; } } if (cur) return *cur; else return -(*tmp);}void String::Display(){ if (_size == 0) cout << "NULL" ; cout << _str << endl;}void String::CheckCapacity(size_t size)//检查容量{ if (size+1 >= _capacity)//size+1考虑到'\0'占一个字节 { _capacity = size > _capacity * 2 ? size : _capacity * 2; _str = (char *)realloc(_str, sizeof(char)*_capacity); }}void String::PushBack(char ch)//尾插字符{ CheckCapacity(_size + 2); _str[_size++] = ch; _str[_size] = '\0';}void String::PopBack()//尾删{ if (_size) { _str[_size - 1] = '\0'; --_size; }}void String::Insert(size_t pos, const char ch)//插入字符{ assert(pos); CheckCapacity(_size + 1); _size++; int count = _size; while (count != pos - 1) { _str[count] = _str[count - 1]; count--; } _str[pos-1]=ch;}void String::InsertS(size_t pos, const char* ch, size_t len)//插入字符串中len个字符{ assert(pos); CheckCapacity(_size + len); _size = _size + len; while (len) { Insert(pos,*ch); pos++; ch++; len--; }}void String::Erase(size_t pos, size_t len)//删除pos后len个字符{ assert(pos); assert(len); while (_str[len + pos - 1]) { _str[pos - 1] = _str[len + pos - 1]; _str[len + pos - 1] = NULL;//前移一位,删除一位 pos++; } _size -= len;}int String::Find(const char ch)//查找字符{ int pos = 1; char* str = _str; while (str) { if (*str == ch) { return pos; } pos++; str++; } return 0;}int String::FindS(const char* ch)//查找字符串,返回字符串的位置{ char*  str= _str; char* s2 = (char*)ch; int pos = 1; while (str) { char* s1 = str; while (s1 && s2 && *s1==*s2) { s1++; s2++; } if (*s2==NULL)//注意在进行一次字符串比较后,判断是否s2指向空 return pos; str++; pos++; } return 0;}

测试用例如下:

void Test1(){//拷贝构造、赋值、比较字符串大小	//String s;	//String s1("ssssss");	//String s2(s1);	//String s3 = s1;	//s.Display();	//s1.Display();	//s2.Display();	//s3.Display();	String S1("hello fo");	String S2("hello foc");	//String S2("hworld!");	//S1.Display();	//S1[6] = 't';	S1.Display();	bool b= S1 == S2 ;	cout << b << endl;	cout << S1.compare(S2) << endl;}void Test2(){//字符串增删查找	String S1;	S1.PushBack('h');	S1.PushBack('e');	S1.PushBack('l');	S1.PushBack('l');	S1.PushBack('o');	S1.Display();	//S1.PopBack();	//S1.PopBack();	//S1.PopBack();	//S1.Display();	//S1.PopBack();	//S1.PopBack();	//S1.PopBack();	//S1.Display();    String S2("hello orld!");	//S2.Insert(7,'w');	//S2.Display();	//S2.InsertS(6, " to try!", 3);	//S2.Display();	//S2.Erase(6, 3);	//S2.Display();	//cout << "d->" << S2.Find('d') << endl;	cout << "ello->" << S2.FindS("ello ") << endl;}

以上是本人对string类的部分实现,如有不足,请多指教。

本文出自 “” 博客,请务必保留此出处

转载地址:http://wilbi.baihongyu.com/

你可能感兴趣的文章
CImg库编译使用.
查看>>
openstack虚拟机创建流程
查看>>
openstack网络总结
查看>>
excel 查找一个表的数据在另一个表中是否存在
查看>>
centos 7 上配置dnsmasq 同时支持ipv4和ipv6的DHCP服务
查看>>
AsyncTask、View.post(Runnable)、ViewTreeObserver三种方式总结frame animation自动启动
查看>>
Android中AsyncTask的简单用法
查看>>
S3C6410启动模式介绍
查看>>
Jlink + ADS调试 S3C2440
查看>>
2440初始化存储器原理(接上一篇)
查看>>
S3C2440 USB 设备控制器(转)
查看>>
Linux usb 设备驱动 (1)
查看>>
解决跨网场景下,CAS重定向无法登录的问题(无需修改现有代码)
查看>>
java反编译命令
查看>>
activemq依赖包获取
查看>>
概念区别
查看>>
关于静态块、静态属性、构造块、构造方法的执行顺序
查看>>
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
idea讲web项目部署到tomcat,热部署
查看>>