STL中的string 功能很强大,比字符数组强到不是一丁半点,接下来看看他的用法:
string 的定义 substr操作 insert操作 erase操作 append和replace操作 assign操作 string搜索操作(find 和 rfind) find_….of函数
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,t;
//s=("china");
//s="china";
//s=t;
//string s("chian")
s="12345"; //1 2 3 4 5
t=s;
cout<<t<<endl; //1 2 3 4 5
cout<<"......"<<endl;
string p=s.substr(0,3); //指定从a 开始后面 b个字符的串
cout<<p<<endl; //1 2 3
cout<<"......"<<endl;
p=s.substr(3); //也可以从a 处到最后的串
cout<<p<<endl; //4 5 可以是一个参数,也可以是两个参数
cout<<"......"<<endl;
// 只能初始化的形式 实现
string s1(s,2); //string 是第几个字符后面的字符的串到s1
cout<<s1<<endl; //3 4 5
cout<<"......"<<endl;
char cs[]="12345";
string s2(cs,2); //char 字符数组 是*前几个字符*的串复制到 s2中
cout<<s2<<endl; //1 2
cout<<"......"<<endl;
string s3="app";
//string 的插入操作
s.insert(2,s3); //12app345在*前几位*指定位置处插入另一个字符串
//s.insert(2,"app",2); //也可以是三个参数,最后一个是字符串前几位赋值到s
cout<<s<<endl; //可以有两个参数
//s.insert(2,s3,0,3); //也可以是4个参数 就是要插入字符串的a到b范围
//cout<<s<<endl;
cout<<"......"<<endl;
//string 的删除操作 比字符数组 更加灵活,在一些字符串问题中,起到的作用更大
s.erase(0,1); //2app345 就是删掉第一位字符 从a位置开始 删除几个字符
//s+=t[0];
cout<<s<<endl;
cout<<"....."<<endl;
s.erase(s.begin()); //用迭代器 删除指定位置的字符
cout<<s<<endl; //app345
cout<<"....."<<endl;
//s.erase(s.begin(),s.end()); // 全部删除
//cout<<s<<endl;
//cout<<"....."<<endl;
//string的搜索操作可以来搜索 一个*字符串* 在一个大字符串里面 是否出现过
size_t found=s.find("app"); // size_t 定义
if(found!=string::npos) // 固定的格式 string:: npos
cout<<"位置"<<' '<<found<<' '<<"find it"<<endl; //如果没有找到,就是返回结尾
//如果找到,那么返回字符串出现的位置
cout<<"......."<<endl;
string s5;
s5="aaa aa a a aa aaa bbb aa";
found=s5.find("aa");
while(found!=string::npos)
{
cout<<found<<' ';
found=s5.find("aa",found+1); //这个参数可以是1 2 3个
}//1个参数就是 找第一个出现的位置,2个参数就是在哪个 起点开始找,3个参数是找的内个字符串 的前几位
cout<<endl;
cout<<"......."<<endl;
//string 的 rfind 找最后一个出现的匹配字符串,返回的位置仍然是从前往后数的。
string s8="the apple is good good good";
size_t found2=s8.rfind("good");
if(found2!=string ::npos)
{
cout<<"位置"<<' '<<found2<<' '<<"find it"<<endl;
}
cout<<"......."<<endl;
//append 是追加字符串和字符的,replace是替换操作
s.append("999"); //qpp345999
//s+="999"; //效果一样
cout<<s<<endl;
cout<<"........."<<endl;
s.replace(1,2,"china"); //achina345999 可以有3个参数,1是要替换的其实位置
//也开始是4个参数和5个参数
cout<<s<<endl;
cout<<"......."<<endl;
s.replace(1,5,"japana",0,5);//ajapan345999 多了两个参数 就是要插入的字符串的开始位置,和要插入几个字符
cout<<s<<endl;
cout<<"........."<<endl;
s.replace(1,5,"apple",5); //aapple345999 就是将 要插入字符串的前几位插入
cout<<s<<endl;
cout<<"........."<<endl;
s.replace(1,5,3,'!'); //a!!!345999 后面两个参数是变成几个那个字符
cout<<s<<endl;
cout<<"........."<<endl;
//迭代器 来实现 替换操作
s.replace(s.begin(),s.begin()+2,"oooo");
cout<<s<<endl; //oooo!!345999
cout<<"........."<<endl;
//string 的 assign 操作 灵活赋值
string s7=s.assign(s); //可以进行赋值字符串
s7.assign(s,0,4); //oooo 需要3个参数,需要插入的字符串,开始位置和几个字符
//s7.assign(s.begin(),s.begin()+4); //可以使用迭代器来做
cout<<s7<<endl;
cout<<"........."<<endl;
// string的比较可以直接 > < = 来比较
//find...of 函数
// find_first_of(str) 找到str 字符串内每个字符出现的位置并且对该字符进行操作
size_t found3=s.find_first_of("!345");
while(found3!=string::npos)
{
s[found3]='#'; //进行操作
found3=s.find_first_of("!345",found3+1); //再去下一位找
}
cout<<s<<endl; //oooo#####999
cout<<"......."<<endl;
//find_first_not_of(str) 找到第一个不在 str 内的字符
size_t found4=s.find_first_not_of("9");
while(found4!=string::npos)
{
s[found4]='9';
found4=s.find_first_not_of("9",found4+1);
}
cout<<s<<endl; // 999999999999
cout<<"......"<<endl;
//find_last_of(str) 找到 str 中任意一个字符最后 出现的位置
//find_last_not_of(str) 找到最后一个不存在 在str串中的字符
return 0;
}
来看两道题 ,你肯定会喜欢上 string 的:
链接:https://ac.nowcoder.com/acm/problem/21179
来源:牛客网
题目描述
Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法。
魔法可以选择字符串的任一位置,并将该位置后面的所有字符水平拼接到串首。
例如:对于字符串abcde,可以通过施加魔法得到cdeab。
如果xxx通过施加魔法将字符串的字典序变得严格比之前的小,那么他将拿走这一字符串。
Rabbit想知道自己的字符串会不会被xxx拿走。
输入描述:
第一行一个整数n,表示字符串的长度。
接下来一行一个长度为n的只由小写字母组成的字符串。
输出描述:
如果Rabbit的字符串会被xxx拿走,输出“YES”。
否则输出“NO”。
(不输出引号)
示例1
输入
复制
5
cdeab
输出
复制
YES
说明
xxx可以把e之后的部分“ab”放到串首,得到abcde,字典序比cdeab小,故将拿走字符串。
示例2
输入
复制
5
abcde
输出
复制
NO
备注:
1≤n≤100000
就是把后面的部分字符串放到字符串首,如果是严格的,并且比初识的串字典序小,那就输出YES,否则就输出NO。
说说思路吧:一开始理解错误思路,我想的是只要有比首字符ASCLL小的,就是NO,但是如果是abadcg 我就是输出NO,应该是YES。于是,大神代码,用了灵活操作的 string 来做这道题。就是每次把第一位字符已到最后一位,然后比较此时字符串与初始字符串字典序哪个大。如果不满足,就继续移动,直到字典序小为止。相对于字符数组,删除移动操作比较麻烦,但是 string是很简单的,大家可以遇见这种问题,可以首先考虑 string 的用法,相对于简单。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s, t;
scanf("%*d");
cin >> s;
t = s;
for (int i = 1; i < t.size(); i++)
{
t += t[0];
t.erase(0,1);
if (t < s)
{
puts("YES");
return 0;
}
}
puts("NO");
}
2.看题
链接:https://ac.nowcoder.com/acm/contest/333/I
来源:牛客网
题目描述
最近Jhadgre拿到了一个系列表情包,他很高兴,于是他给每个关系好的女性好友都送了一盒饼干外带这一套表情包。
结果让他惊呆了,竟然真的有女孩子答应他........再来一盒(不然你以为?)
当然也有人回复一些其他的消息...唯独没有答应做他女朋友的人。
Jhadgre很伤心,但是作为一个有原则的人,既然答应了送别人小饼干,那就必须要给!
所有人的回复都由大写字母,小写字母与','组成,占一行,Jhadgre认为只要其中包含了连续的10个小写字母"zailaiyihe"就意味着这个人想要再来一盒。
现在Jhadgre准备给每一个想要“再来一盒”的人买一盒小饼干,他想知道总共需要买几盒小饼干?
输入描述:
第一行一个整数N,表示有N个人回复(1<=N<=1000)
接下去N行每行都是一个人的回复,由大写字母,小写字母与','组成。
(数据保证每行字符不超过1000个)
输出描述:
一个整数表示Jhadgre需要买几盒小饼干
示例1
输入
复制
3
Bu,xing
wokeyizailaiyihe
no
输出
复制
1
刚拿道题,完全没有思路,难道是KMP算法,大一没有开数据结构,怎么办,还是看看大神的代码学习一下:
一看这么短的代码,还带上“水题”的标签,哎,我太菜了。
就是用了string 的一个搜索str.find() 函数,就可以AC掉。那个格式string::npos 是一定的。
代码:
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
using namespace std;
#include<string.h>
const int maxn=1005;
typedef long long ll;
int main()
{
int n;
int k=0;
cin>>n;
while(n--)
{
string a;
cin>>a;
if(a.find("zailaiyihe")!=string::npos)
{
k++;
}
}
cout<<k<<endl;
return 0;
}
https://blog.csdn.net/tengfei461807914/article/details/52203202 推荐看看详解。
https://blog.csdn.net/fioletfly/article/details/53941954