map
map(映射):它可以将任何基本数据类型【键 key】映射到任何基本数据类型【值 value】(包括STL),常用到的就是建立string型到int型的映射。map在建立映射的过程中会自动去重,同时按key从小到大的排序功能(set也是)。
另外:STL中,string和vector可以使用*(it+i)的访问方式,其他容器迭代器只能使用自加或自减的方式枚举
经常用来判断某个元素是否出现过
可以用count()函数判断,它会返回某元素的个数(0/1);
也可以直接访问map[key],但是当判断的元素key不存在时,它会自动先创建一个key到零的映射。
举个栗子:题目链接
代码:
#include <iostream>
#include<map>
using namespace std;
int main()
{
int n,m,com=0;
string str;
map<string,int>mp;
scanf("%d%d",&n,&m);
int n1=n,m1=m;
while(n1--)
{
cin>>str;
mp[str]=1;/*建立str到1的映射,表示它出现过*/
}
while(m1--)
{
cin>>str;
//mp[str]++;
//cout<<mp[str]<<endl;
if(mp[str])//如果str没有出现过,就会返回0
com++;
}
if(com%2)
{
if(n>=m)
printf("YES\n");
else
printf("NO\n");
}
else
{
if(n>m)
printf("YES\n");
else
printf("NO\n");
}
}
string
列几个会我经常用到函数:
length()/size() : 返回string的长度,即存放的字符数(两个函数基本相同)
substr() : substr(pos,len)返回从pos位置开始长度为len的子串
reverse() : 字符串反转函数
举个栗子:题目链接
代码:
#include <iostream>
#include<string>
using namespace std;
int main()
{
string str1,str2;
while(cin>>str1>>str2)
{
int flag=0;
int l1=str1.size(),l2=str2.size();
int len=min(l1,l2);
for(int i=len;i>=1;i--)
{
string st1=str1.substr(l1-i,i);//返回后i位
string st2=str2.substr(0,i);//返回前i位
if(st1==st2)
{
cout<<st1<<endl;
flag=1;
break;
}
}
if(!flag)
cout<<'"'<<"NULL!"<<'"'<<endl;
}
}
其他:
find(str2):
当str2是str的子串时,返回其在str中第一次出现的位置,否则返回string::npos(两个字符串长度分别为n、m) O(nm)
find(str2,pos):从str的pos位开始匹配,返回值同上