c++ 標準模板庫的應用

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



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章