String类以及删除字符串中的子串

String类

#include <string>
using namespace std;

string可以通过下标访问也可以通过迭代器访问。

string可以进行拼接,用+即可,也可以加上一个字符。

string可以进行比较,==  !=  <  >  <=  >=,按照字典序进行。

string通过length()或size()来返回长度。

常用函数:

(1) insert

insert(pos,string),在pos位置处插入字符串string。

insert(it,it2,it3) it为原字符串欲插入的位置,it2和it3为待插入字符串首尾迭代器,用来表示[it2,it3)将被插入到it位置上。

(2)erase

删除单个元素:str.erase(it)  it为需要删除的元素的迭代器。

删除某个区间的元素str.erase(first,last)  first与last都是迭代器,区间为[first,last)

或者:str.erase(pos,length)  pos为要删除的起始位置,length为字符个数

(3)clear

str.clear() 用于清空string中数据。

(4) substr

substr(pos,len)用于返回从pos下标开始,长度为len的子串。

(5)string::npos

是一个常数,本身的值为-1,但由于是unsigned_int类型,也可做它的最大值。它用于作为find函数失配使返回的值。

(6)find

str.find(str2)  当str2时str的子串时,返回其在str中第一次出现的位置,如果不是子串,返回string::npos。

if(str.find(str2)!=string::npos)

(7)replace()

str.replace(pos,len,str2) 把str从pos位置开始。长度为len的子串替换为str2。

str.replace(it1,it2,str2)把str迭代器[it1,it2)范围的子串替换为str2.
 

删除字符串中的子串

第一种情况:删除所有子串,使最后的字符串中不包含该子串。

比如:Tomcat is a male ccatat ,要删除子串cat,其结果是Tom is a male

#include <string>
#include <iostream>

using namespace std;

//法一
string solve_f1(string &s1,string &s2)
{
    if(s2.size()==0)
        return s1;

    int i;
    while((i=s1.find(s2))!=-1)
    {
        s1.erase(i,s2.size());
    }
    return s1;
}

//法二
string solve_f2(string &s1,string &s2)
{
    if(s2.size()==0)
        return s1;
    for(int i=0;i<(volatile)(s1.size()-s2.size()+1);)
    {
        if(s1.substr(i,(volatile)s2.size())==s2)
        {
            s1.erase(i,(volatile)s2.size());
            if(i>0)
                i--;
        }
        else
            i++;
    }
    return s1;

}

int main()
{
    string input;
    string to_del;
    getline(cin,input);
    getline(cin,to_del);

    string res=solve_f2(input,to_del);
    cout<<res<<endl;
    return 0;
}

注意法二每次删完之后,都要回溯到前一个位置(不用回溯到初始位置)。

注意volatile关键字的使用,防止由于编译器优化而得不到最新的str.size()

 

第二种情况:只是删除原来字符串中连续的子串。

比如:Tomcat is a male ccatat ,要删除子串cat,其结果是Tom is a male cat

#include <string>
#include <iostream>

using namespace std;

string solve(string &s1,string &s2)
{
    if(s2.size()==0)
        return s1;

    for(int i=0;i<(volatile)(s1.size()-s2.size()+1);)
    {
        if(s1.substr(i,s2.size())==s2)
        {
            s1.erase(i,s2.size());
        }
        else
            i++;
    }

    return s1;
}


int main()
{
    string input;
    string to_del;
    getline(cin,input);
    getline(cin,to_del);

    string res=solve(input,to_del);
    cout<<res<<endl;
    return 0;
}

删除完之后不用回溯。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值