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;
}
删除完之后不用回溯。