猿创征文——C++|string类2

 

目录

 assagin|erase|insert

 c_str()

find 

用find和substr实现网址的分离 

operator (了解内容)

getline 

 convert

习题 字符串中的第一个唯一字符 

习题 验证一个字符串是否回文 


 assagin|erase|insert

assign相当于赋值语句 

 

 insert插入,可插入某个string对象,字符串,字符,在某位置前插入

若想在空格处插入%20,下面这种写法会出问题

 

当遇到空格之后,insert会把%20插入到空格前面,然后把其余字符串往后挪, 

而插入之后,i还在原来位置,往后遍历又会遇到空格,所以程序会陷入死循环 

修改每次i插入后的位置,程序正常运行

 若想吧空格替换为%20

erase是用来删除的 

string& erase(size_t pos=0,size_t lend=npos)

从0这个位置开始删除len个字符

如果len>剩余字符串长度,则有多少删除多少,删到结尾

 用insert和erase效率太低,我们采用空间换时间的方法来优化

时间复杂度比之前低一点,但是空间复杂度变高

 

刚才的写法,还可用replace替代,replace是用来替换的,但是效率不高,也要挪动数据,

insert,erase,replace不推荐使用,效率低

 c_str()

c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同。
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

 

返回const char * 类型 

 用C语言的方式打开文件,此时报错

 加上c_str即可正常运行

 读取当前文件

 比较这俩种写法

效果一样 ,但是实际不一样,底层原理不一样

 C++中是以string对象size为准,size为多少就输出多少个

而C语言是以常量字符串遇到\0结束

find 

 

 find可查找一个字符,字符串,string对象,pos指从某个位置开始查,n代表要匹配的字符序列的长度。

返回值是无符号类型,如果找到了返回找到的第一个字符的位置,如果没找到返回string::npos,npos是一个特别大的数字

 

 有时还会用到substr

 取当前string的字符串返回一个新对象,从pos位置,取len个字符,规则跟前面取字符一样

用find和substr查找文件的后缀名

 有的文件后缀比较复杂:如.exe.zip

当我们想取最后一个后缀的时候,可用rfind

搜索由其参数指定的序列的最后一次出现。 

把find替换为rfind之后,直接找到最后一个.

用find和substr实现网址的分离 

void test_string5()
{
	string ur1 = "https://cplusplus.com/reference/string/string/rfind/";
	size_t pos = ur1.find("://");
	string ur2 = ur1.substr(0, pos-1);
	cout << ur2 << endl;
	size_t pos1 = ur1.find('/', pos + 3);
	string ur3 = ur1.substr(pos + 3, pos1 - pos-3);
	cout << ur3 << endl;
	string ur4 = ur1.substr(pos1+1);
	cout << ur4 << endl;
}
int main()
{
	test_string5();
	return 0;
}

 

  find_first_of:在字符串中搜索与其参数中指定的任何字符相匹配的第一个字符,指定pos位置时,从pos位置开始搜索,匹配一个字符就够了(不是全部匹配)

operator (了解内容)

string还有+比较大小等功能

 

getline 

不管是cin还是scanf,遇到空格或者换行会进行间会把hello传输给a,空格和c保留在缓冲区

 

 C++ string中有getline可以解决上面的问题

 从 is 中提取字符并将其存储到 str 中,直到找到分隔字符 delim(或换行符“\n”,表示 (2))

如果到达文件的末尾或者在输入操作期间发生其他错误,则提取也会停止。

如果找到分隔符,则将其提取并丢弃(即不存储它,下一个输入操作将在它之后开始)。

请注意,调用之前的任何内容都将替换为新提取的序列。

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)

#include <iostream>
#include <string>
using namespace std;

int main(){
      string str;
    getline(cin,str);
    size_t pos=str.rfind(' ');
    if(pos!=string::npos)
    {
        cout<<str.size()-1-pos<<endl;
    }
    else
    {
        cout<<str.size()<<endl;
    }
}

 convert

C++中convert使用率比较高

 atoi可把字符串转整形

 itoa整形转字符串

to_string将数字常量转换为字符串,返回值为转换完毕的字符串,返回类型为string

 也能转回去

 

习题 字符串中的第一个唯一字符 

387. 字符串中的第一个唯一字符 - 力扣(LeetCode) 

class Solution {
public:
    int firstUniqChar(string s) {
int arr[26]={0};
for(auto ch:s)
{
    arr[ch-'a']++;
}
for(int i=0;i<s.size();i++)
{
    if(arr[s[i]-'a']==1)
    return i;
}
return -1;
    }
};

 思路:创建一个容量为26的整形数组,数组第一个元素到第一个元素分别用来统计a到z出现的次数,

习题 验证一个字符串是否回文 

125. 验证回文串 - 力扣(LeetCode)

class Solution {
public:
bool IslettersorNumb(char str)
{
if((str>='0'&&str<='9')||(str>='a'&&str<='z'))
return true;
else
return false;
}
    bool isPalindrome(string s) {
        for(auto& ch:s)
        {
            if(ch>='A'&&ch<='Z')
            ch+=32;
        }
        int begin=0,end=s.size()-1;
        while(begin<end)
        {
            while(begin<end&&!IslettersorNumb(s[begin]))
            begin++;
            while(begin<end&&!IslettersorNumb(s[end]))
            end--;
            if(s[begin]!=s[end])
            return false;
            else
            begin++;
            end--;
        }
        return true;
    }
};

  • 39
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发没有代码多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值