string 的接口

        我们继续来讲解一些常用的string接口。

        一.at接口

        

        我们来看一个越界的问题。

        我们运行之后发现这是一个断言错误,直接就终止我们的程序了,不能作为异常被捕捉到,但是我们如果不想让程序直接崩溃该怎么办呢?

        此时我们就要用到at关键字了。

        at 函数的重要特性是会进行边界检查。若传入的索引超出字符串的有效范围(即 pos >= str.size()),它会抛出 std::out_of_range 异常。

        

       

        此时程序不会直接崩溃而是抛出一个异常。

        

二 push_back

        这个就是添加元素的。

        

        此时s1就是x了。

        这个没什么讲的,一次只能插入一个字符。

        

三.append

        这个就是添加字符串的,可以一次添加多个元素。

        

        就是把这个字符串给添加上去了。

        

        我们可以看到有六个用法,大家感兴趣的都可以试试,我只讲一些常用的吧。

        

        我们来看一下这个代码,capacity和size的大小都是不带/0的。

        下面两个就是常用的,可以通过迭代器的形式来给它值,最后一个append表示我们从s2的第六个开始,把后面都加上去,也就是wrold。

                        

      

        这样也是可以的,这是因为实现了运算符的重载。

        

        


四.思考     

  下面我们来思考一下,size>capacity的时候,系统是怎么扩容呢?

        我们来研究一下。

        

        我们运行一下看一下。

        

        我们发现是1.5倍左右(每个编译器都是不同的),但是第一次扩容为什么会是两倍呢?

        因为我们可以认为是编译器优化吧,vs如果你小于16的话,它是会有一个Buff数组来存放这些数据的,这样会减少内存碎片,你要是超过这个大小才会扩容,第一次就是buff的二倍,以后才是原来的1.5倍数来扩容的。

        我们用g++来演示一下。

        

        我们看到g++的扩容原则是两倍两倍的扩容。

        

        


五.reserve

      这个接口的主要作用就是用来扩容的。

          

        我们来看一下这个图,当我们的预留空间小于size的时候。

        要遵守这个原则,不能影响原来的内容,所以小于size的时候,一定不会缩容的,大于capacity一定是要扩容的,但是大于size小于capacity的时候就不一定缩容了,可能缩容也可能不缩容。

        

        

        我们发现并没有缩容的情况,我们再在g++上试一下。

        

        我们发现在g++上出现了缩容现象。

        



六.resize

        

        这个的主要作用就是改变size 的大小的。

        

        如果给的这个数小于size的大小就会删除多余的数据,大于size小于capacity的话就会插入数据,不给第二个参数,如图第二行就会用/0来补充,大于capacity的话就会扩容和插入数据。

        

        



七.insert

        

        我们来看一下,第一个insert,就是在0位置插入hello,我们要是只想插入一个char类型的单个字符怎么办呢?

        就是第二个insert,就是在0位置插入1个a,尽量还是不要用insert,因为它的时间复杂度是o(n),会使效率很低。

        

        



八.erase

                       我们主要用第一个和第三个,第一个就是第二个erase,那个npos你可以理解为无穷大,不给值就会用缺省值,表示删除第五个以后的元素, 第一个erase表示删除第五个后面的两个元素也就是第六个和第七个。

九.replace

        

        图中replace的使用就是从下标5开始的两个字符用s2字符串来替换掉,所以s1中的3,4两个字符就被s2给替换掉了。

        我们来出一个题,我们要把一个字符串中的空格全部换成%%,怎么实现呢?

        

        这是我们的第一种实现的方法,就是通过find配合这replace来使用,每次找到就替换,就可以完成我们的需求了。

        

        这是我们的第二种方法效率更高,定义一个新的空字符串,然后通过循环找到空格符号就把它替换成%%,最后重新给s3初始化一下就行了,swap就是把他俩交换一下。

      十.substr

          

        substr就是我们的预期就是从pos位置开始取后面的全部数据,所以就是从pos开始的size()-pos个数据,最后一个的下标是size()-1,我们可以给第二个参数,也可以不用给,因为它有缺省值,就是npos(一个很大的无符号的数),

        就像上图这样,它会自动给第二个参数。

        十一.rfind

        

        rfind就是从最后一个字符开始往前找,效率会更高。这个find和rfind如果我们给的字符并没有在字符串中找到就会返回npos,就是最大的无符号的整数,此时我们两个无符号数相减就是,比如最大无符号数是256,我们1-256=2,就是我们的数如果小于0就会变回最大数,相当于我们1减去256中的一个1,0又减去255中的一个1,此时前面那个数就变成了256,就是256-254=2了。

        十二.file.find_first_not_of

        

        这个就表示,我们会从上述字符串中找到t或者是p然后返回下标,可以同时保留多个字符。

        十三.c_str

        

        这个就是把字符串类对象的变量转换成一个字符型指针的类型。

        我们再来看一下这个,就是我们打开文件需要传入字符型指针,但是我们是string类类型的,此时就可以使用c_str了。

        字符串还有下面的性质,就是下面的代码,这些都是可以了,大家可以了解看一下。

十四.geiline

        这个我们来结合一个题来看一下。

        这个题就是我们要找到最后一个单词的长度,我们都知道单词是通过空格来分割开的,这道题需要我们自己来写输入的字符串,但是我们都知道,cin遇到空格和换行符都会认为你已经输入完毕了,该输入下一个字符了,这导致我们无法在一个字符串中输入一句完整的话,这导致我们无法通过它的全部测试用例,这时候怎么办呢?

        就可以用到getline了,这个有两个用法。

        

        一个就是这样,直到我们见到回车才会结束输入,还有一种用法。

        

        就是这里的第二种可以自己指定结束的符号,我们图中的只要我们不输入*号,我们就不会结束。

十五.isalpha

        它用于判断一个字符是否为字母(包括大写字母和小写字母),就是判断我们给的字符是不是字母的,很常用。



十六.例题

        我们来做几道关于字符串的例题吧。

        

        大家可以先分析一下这道题,看看有没有思路。

        不知道大家发现没,这个和我们之前写的霍尔类型的快排很像,就是左右各给一个指针,然后就找是字母的,不是就往前或者往后找。

        代码如下:

        

        通过上面那个函数来判断是不是字母,然后就是霍尔快排了,while中的那两个while的begin<end这个条件的作用就是当我们都不是字母的时候防止了越界行为。

        我们可以不用写那个判断函数,string库里面是有这个函数的,我们来用一下。

        

        就是我们这样的函数,也是可以完成我们的需求的。

       我们再来看一下这道题吧。

        就是找出第一个只出现一次的字符,我们可以用我们基数排序的思想。

        先定义一个存放26个字母的数组,然后统计每个字母出现的次数放入对应的数组中,然后再判断哪个字母出现的次数为1找到就返回下标即可。

        

                

        我们来看一下这道题。

        要求我们使用字符串完成两个数相加的操作。

        

        我们来分析一下这个思路吧,就是我们先拿到每个字符串的最后一个元素,然后通过next获得需要进位的数字,str存下得到的结果,通过一个while循环,下面的三目运算符的作用就是,例如一个三位数加上一个两位数,如果没有三目运算符就会出现越界的情况了,下面的思路就很清晰了,那个if语句就是当我们两位数相加的时候,第二次不会进入循环,所以我们字符串的结果是不对的,此时next的值没有算进去,所以我们要加一个if语句把这个我们遗忘的值加进去即可,最后反转一下字符串即可完成。

十七.结束语

         感谢大家的查看,希望可以帮助到大家,做的不是太好还请见谅,其中有什么不懂的可以留言询问,我都会一一回答。  感谢大家的一键三连。

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值