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;
}



 

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