目前涉及到的模板只有两种,一种是比较常用的map 另外一种是反转函数 reverse()
map:map函数具有一对一性质,用于不同类型的对应关系。
以下是map函数的基本用法
1> 构造函数
map<X,Y>MAP_NAME; X为key值,Y为value
其中X,Y可以是任意类型,如 string,char,int 彼此之间可以进行任意组合。
2> 插入函数,有以下三种插入方式,最常用的为第三种
map<X,Y>MAP;
MAP.insert(pair(X,Y)(E,F);
MAP.insert(map<X,Y>::value_type(E,F));
MAP[E]=F;
3> 元素查找
find()函数返回一个迭代器指向键值为key的值,如果没有找到就返回指向
map尾部的迭代器。
map<X,Y>::iterator itr;
itr=find(E):
if(itr==MAP.end())
cout<<"not find"<<endl;
else
cout<<"find it"<<endl;
4> 元素删除,首先必须保证该元素存在。
map<X,Y>::iterator itr;
itr=find(E);
if(itr==MAP.end())
cout<<"not find"<<endl;
else
MAp.erase(itr);
5> map的sort函数
map函数在存储的过程中已经按照key值的大小按升序排列,严格来说已经不需要为map排序
6>map的基本操作函数
find() 查找函数 erase() 删除函数
end() 返回尾部迭代器 begin() 返回头部迭代器
size() 返回map中的元素个数
count() 返回制定元素出现的次数
poj 3096
题目大意:按照给出的字符串先后顺序,任意组合两个字母成为一个字符串
,研究是否会出先重复
思路:用map进行存储,判断是否出现两个相同的字符串
#include <queue>
#include <stack>
#include <math.h>
#include <vector>
#include <limits.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>
#include <map>
using namespace std;
int main()
{
char data[100];
int i,d;
while(cin>>data&&data[0]!='*')
{
int len=strlen(data);
bool mark=true;
if(len<=2)
{
cout<<data<<" is surprising."<<endl;
continue;
}
for(d=0;d<=len-2;d++)
{
map<string,bool>flag;
for(i=0;i<=len-2-d;i++)
{
char k[3]={data[i],data[i+d+1],'\0'}; //组合字符串
if(!flag[k])
flag[k]=true;
else
{
mark=false;
break;
}
}
if(!mark)
break;
}
if(!mark)
cout<<data<<" is NOT surprising."<<endl;
else
cout<<data<<" is surprising."<<endl;
}
return 0;
}
reverse 函数: reverse 函数是c++ 自定义的反转函数,可以对字符串进行反转、根据指定的
范围进行反转,返回翻转后的字符串,若无法反转则返回空字符。
poj3007
题目大意 : 将n长字符串分为1 和n-1部分,2 和n-2部分.....依次类推,分别对他们进行
各自反转和调换前后位置,计算会出现多少个不同的字符串、
#include <queue>
#include <stack>
#include <math.h>
#include <vector>
#include <limits.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <functional>
using namespace std;
const int M=200;
char word[M*200][200],str[200],strr[200];
int color;
void Write(char *s)
{
int i;
for(i=1;i<=color;i++)
if(!strcmp(s,word[i]))
return ;
strcpy(word[++color],s);
}
int main()
{
int m,i;
cin>>m;
while(m--)
{
color=0;
cin>>str;
int len=strlen(str);
for(i=0;i<len-1;i++)
{
strcpy(strr,str); //正1,正2
Write(strr);
reverse(strr+i+1,strr+len); //正1,反2
Write(strr);
reverse(strr,strr+i+1); //反1,反2
Write(strr);
reverse(strr+i+1,strr+len); //反1,正2
Write(strr);
reverse(strr,strr+len); //反2,正1
Write(strr);
reverse(strr+len-i-1,strr+len); //反2,反1
Write(strr);
reverse(strr,strr+len-i-1); //正2,正1
Write(strr);
reverse(strr+len-i-1,strr+len); //正2,反1
Write(strr);
}
cout<<color<<endl;
}
return 0;
}