string模拟实现

这篇具有很好参考价值的文章主要介绍了string模拟实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

整体逻辑:

1、构造函数,析构函数

2、遍历,size(),operator[],迭代器iterator

3、增删查改

push_back   append(串)   插入前需要检查容量,reserve()   再重载+=

insert(挪动时,size_t pos小心死循环下标为0,可以引入npos多一步判断)   

erase  find  substr     关系运算符重载

4、流插入、流提取 利用c_str打印

5、拷贝构造、赋值运算符重载

一、构造/析构

1、构造函数

string模拟实现,C++人生,算法,c++

size_t len = strlen(str),避免多次strlen效率低。

构造空串时可以利用一个指向" "的指针,还可以写成全缺省。

string模拟实现,C++人生,算法,c++

len为0,开1个空间,把\0拷贝过去。

2、析构函数 

string模拟实现,C++人生,算法,c++

先释放_str指向的空间,然后系统自动回收内置类型。 

二、遍历相关

1、[],size()

string模拟实现,C++人生,算法,c++

operator[]返回的是char&,const版本可以让const对象调用,只读。

 2、迭代器iterator

string模拟实现,C++人生,算法,c++

在string中,iterator是原生指针char*。

分别定义char*为iterator,const char* 为 const_iterator,两种迭代器是两种不同的类型。

两个begin()函数,以const为区分。

注:这里的const修饰的是string对象,是string对象是否加const,对应其调用的begin()函数是否加const

string模拟实现,C++人生,算法,c++

 如果是s1使用cit遍历,调用的是没有const修饰的begin函数,返回的是iterator,理论上是可以修改的,但是接收的是const_iterator权限缩小,最终的效果也是没有修改。

只有当const对象s2使用cit遍历时,const对象对应const修饰的begin函数,返回的也是const_iterator,达到只读效果。

 本质上,const修饰的是*this这个对象,也就是之前说过的const对象只能调用const修饰的成员函数。

三、插入系列

1、reserve

string模拟实现,C++人生,算法,c++

只扩大容量,不缩容。

 strcpy只拷贝到第一个\0结束。

对于”hello\0world”需要用memcpy,_size+1是为了把最后的\0也拷贝过去

2、push_back

string模拟实现,C++人生,算法,c++

先检查是否需要扩容,容量为0时给一个初始值为4

尾插后,将原来的\0覆盖了,不要忘记再补上。 

3、append

 string模拟实现,C++人生,算法,c++

append是追加一个串,为了避免重复扩容,先算一下串的长度len(如果需要就增容)

然后将str拷贝到_str+_size后。

这里用的是char* str,所以strcpy和memcpy相同。

4、重载+= 

string模拟实现,C++人生,算法,c++

+=一个字符,复用push_back

+=一个字符串,复用append

5、resize 

调整_size并初始化,必要时也会调整_capacity

string模拟实现,C++人生,算法,c++

6、insert 

string模拟实现,C++人生,算法,c++

插入一个字符c时,先检查容量。

然后从_size开始把[pos,_size]往后移一个,包括_size位置的\0

头插时,防止size_t的end越界,必须让end>pos才能进入循环 

string模拟实现,C++人生,算法,c++

 insert一个字符串时,先得到len,然后检查是否需要扩容。

然后将[pos,_size]向后移动len个单位到[pos,+len,_size+len]

最后将str全部拷贝到[pos,pos+len-1],共len个,不包含\0

string模拟实现,C++人生,算法,c++

也可以加上npos来判断

7、erase 

string模拟实现,C++人生,算法,c++

第二种情况将[pos+len,_size]往前移动len个单位即可。 

8、find

string模拟实现,C++人生,算法,c++

找某个字符c从某个位置pos出现的第一个位置

直接从pos开始遍历,找到后返回下标即可。

string模拟实现,C++人生,算法,c++

 利用库里的strstr函数,从_str+pos的位置开始找子串s

找到返回找到的下标,没找到返回nullptr。

找到时,ptr-_str指针相减,得到之间相差的元素个数,即下标位置。

9、substr

string模拟实现,C++人生,算法,c++

当截取长度过长时,调整realLen为_size-pos,即截取pos后所有(不包括\0)

然后从pos位置开始截取共reaLen个字符。

10、关系运算符重载 

string模拟实现,C++人生,算法,c++

对于<操作符,保证都在范围内比较。

比较出来大于和等于都返回false。

一直相等到一个结束,此时size()短才小于。

string模拟实现,C++人生,算法,c++

优化后,先利用memcmp比较size个字符得到结果

ret为0时扔比较两个的长度,不为0时看ret比较出来的结果,<0则为true

string模拟实现,C++人生,算法,c++

strcmp只能比较C字符串,不能比较string所有情况。如hello\0world这样中间带\0的

四、输入输出 

1、c_str

string模拟实现,C++人生,算法,c++

返回C形式的字符串,可以直接cout打印

2、cout

string模拟实现,C++人生,算法,c++

[0,_size]都打印,包括其中的\0 

3、cin

string模拟实现,C++人生,算法,c++

string模拟实现,C++人生,算法,c++

string模拟实现,C++人生,算法,c++

拿到空格和\n后才能结束循环。

 五、拷贝构造/运算符重载

1、传统写法

string模拟实现,C++人生,算法,c++

string模拟实现,C++人生,算法,c++

2、现代写法

string模拟实现,C++人生,算法,c++ string模拟实现,C++人生,算法,c++

先构造出一个局部的string tmp,然后通过string中的swap函数,交换tmp和*this的成员(浅拷贝)

销毁时,局部的tmp会自动调用析构函数(*this必须先初始化一下,不能把脏数据给tmp析构)

帮忙清理资源。而*this则是一个拷贝好的string。

注:这里用的是string中的swap,浅拷贝交换它们的成员。如果用算法库中的swap,会创建出一个中间对象string,完成深拷贝,效率低。

string模拟实现,C++人生,算法,c++

直接拷贝构造出一个str,然后swap交换。

此时如果用算法库里的swap,会调用负值重载,导致栈溢出。

3、写时拷贝 

string模拟实现,C++人生,算法,c++

 只读时,为浅拷贝,地址相同。

修改时,引用计数-1,重新开空间完成一次深拷贝

引用计数为1时才析构,平时计数-1.

目录

整体逻辑:

一、构造/析构

1、构造函数

2、析构函数 

二、遍历相关

1、[],size()

​编辑 2、迭代器iterator

三、插入系列

1、reserve

2、push_back

3、append

4、重载+= 

5、resize 

6、insert 

7、erase 

8、find

9、substr

10、关系运算符重载 

四、输入输出 

1、c_str

2、cout

3、cin

​编辑 五、拷贝构造/运算符重载

1、传统写法

2、现代写法

3、写时拷贝 文章来源地址https://www.toymoban.com/news/detail-542512.html


到了这里,关于string模拟实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • string模拟实现:

    上一篇博客,我们对String类有了一个基本的认识,本篇博客我们来从0~1去模拟实现一个String类,当然我们实现的都是一些常用的接口。 ❓我们这里定义了一个string类型,然后STL标准库里面也有string,两个名字一样我们分不清楚怎么办呢? 为了跟库的string区分开,我们可以定

    2024年02月14日
    浏览(30)
  • string模拟实现

    1、构造函数,析构函数 2、遍历,size(),operator[],迭代器iterator 3、增删查改 push_back   append(串)   插入前需要检查容量,reserve()   再重载+= insert(挪动时,size_t pos小心死循环下标为0,可以引入npos多一步判断)    erase  find  substr     关系运算符重载 4、流插入、流提取

    2024年02月13日
    浏览(37)
  • string的模拟实现

    2024年04月12日
    浏览(26)
  • string类的模拟实现

    上一篇博客我们对string类函数进行了讲解,今天我们就对string类进行模拟实现,以便于大家更加深入地了解string类函数的应用 由于C++的库里面本身就有一个string类,所以我们为了不让编译器混淆视听,我们可以首先将我们自己模拟实现的string类放入一个我们自己定义的命名空

    2024年01月21日
    浏览(35)
  • C++ 模拟实现string类

    目录 一、类的定义 二、初始化销毁 1、构造函数 2、辨析三种定义  3、析构函数 三、赋值  1、拷贝构造函数 2、赋值运算符 四、成员访问  operator[ ] 五、比较大小判断相等 六、容量操作  1、size() 2、reserve 3、push_back 4、append 5、加等运算符  6、C风格 7、insert 插入字符  插入

    2024年02月05日
    浏览(46)
  • 【C++】——string的模拟实现

    前言: 在之前的学习中,我们已经对string类进行了简单的介绍,大家只要能够正常使用即可。但是在面试中,面试官总喜欢让学生自己 来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。因此,接下来我将带领大家手动模拟实现一下

    2024年02月05日
    浏览(38)
  • C++ string类模拟实现

    目录 string类成员变量 一.构造函数 二.析构函数 三.拷贝构造 四.size(),capacity() 五.operator [ ] 六. operator =  七.字符串比较  八.reserve() 九.push_back(),append() 十.operator+=  十一.insert()  十二.迭代器  十二.erase() 十三.swap()  十四.find() 十五.流提取,流输出 十六

    2024年02月14日
    浏览(36)
  • C++: string的模拟实现

    注意:本文会用到strcpy,strstr,strncpy,strlen这几个函数 我会说明它们的功能和用法 如果大家想要彻底了解这几个函数 可以看一下我之前的博客: 征服C语言字符串函数(超详细讲解,干货满满) 比如说leetcode字符串相加这道题 既然string的模拟实现对我们这么重要 那就让我们一起踏上

    2024年02月04日
    浏览(36)
  • C++:string类模拟实现

    1.获取容器大小(_size)和容量(_capacity) 2.扩容(reserve) 3.更改容器大小 1.尾插 2.指定位置插入 3.指定位置删除 4.清空 5.交换两个对象 1.截取子串 2.取得C格式字符串 3.赋值

    2024年02月13日
    浏览(37)
  • Cpp学习——string模拟实现

      目录 一,string的成员变量 二,string的各项功能函数 1.构造函数 2.析构函数 3.扩容函数 4.插入与删除数据的函数 5.+=运算符重载 6.打印显示函数 7,拷贝构造 8.find函数     在模拟实现string之前,首先就要先知道string是个啥子。其实string可以简单的理解为一个管理字符的顺序

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包