目前涉及到的模板只有兩種,一種是比較常用的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;
}