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模板网!

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

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

相关文章

  • 【C++】模拟实现string

      目录 🌞专栏导读 🌛定义string类  🌛构造函数 🌛拷贝构造函数 🌛赋值函数 🌛析构函数  🌛[]操作符重载  🌛c_str、size、capacity函数  🌛比较运算符重载   🌛resize与reserve函数 🌛push_back、append函数  🌛insert函数  🌛erase函数 🌛find函数  🌛swap函数 🌛clean函数  🌛

    2024年02月14日
    浏览(34)
  • C++——string模拟实现

    前言:上篇文章我们对string类及其常用的接口方法的使用进行了分享,这篇文章将着重进行对这些常用的接口方法的内部细节进行分享和模拟实现。 目录 一.基础框架 二.遍历字符串 1.[]运算符重载 2.迭代器 3.范围for 三.常用方法 1.增加 2.删除 3.调整 4.交换 5.查找 6.截取 7.比较

    2024年03月12日
    浏览(28)
  • string模拟实现

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

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

    2024年04月12日
    浏览(20)
  • C++模拟实现string类

    在C语言中,字符串是以’\\0’结尾的字符的集合,为了操作方便,C标准库中已经提供了一些str系列的库函 数,但是这些库函数与字符串是分离的,不符合面向对象编程的思想,而且底层空间需要用户自己管理,很可能会造成越界访问。 C++中对于string的定义为:typedef basic_s

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

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

    2024年02月12日
    浏览(24)
  • [C++]string及其模拟实现

    目录 string及其模拟实现::                                        1.构造函数                                        2.拷贝构造函数                                        3.赋值运算符重载                                        4.析构函数        

    2024年02月07日
    浏览(60)
  • 【C++】string类模拟实现

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C++  🛹Linux 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同

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

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

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

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

    2024年02月04日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包