STLマップと文字列

転載元:http://hi.baidu.com/blackstar08/blog/item/a385507619bd9a15b051b9ac.html

  私はいつもstlに慣れていませんが、文字列の問題を処理するとき、stlは非常に使いやすいことがわかったので、過去2日間でstlの知識を断固として読んだので、それを要約します。

  stlのマップの場合、最初に導入されたヘッダーファイルは次のとおりです。#include <map>
  、次に定義は(一般的な使用法):map <int、string> st;ここで、stはマップコンテナーの変数名です;
  メンバー関数マップの内容は
  次のとおりです。st.clear(); // stをゼロに設定
  st.empty(); // stが空かどうかを判別
  st.erase()//削除する場合は、キーワードを削除するか、分割して削除できます
          //たとえば、st.erase(1); deleteキーワードが1の場合、成功すると1を返し、それ以外の場合は0になります
          。//たとえば、st.erase(st.begin()、st.end() ); st全体を削除し、閉じて開く前に削除します。間隔;
  st.find(); // find関数を使用してデータの場所を特定し、イテレータを返します。データが表示されると、
          //データを返します。データの場所のイテレータ。マップDataに何も見つからない場合、データによって返されるイテレータは、st.find(1)などのend関数によって返されるイテレータと同じです。つまり、その要素
  はst-> first is 1が見つかります; st.begin(); //最初の要素位置のイテレータ
  st.end(); //最後の要素の後の位置のイテレータは実際には存在しません
  st.rbegin ()、st.rend()//最後の要素のイテレータと最初の要素の前のイテレータ(存在しません)、//逆にアクセスできます
  st.size(); //どれだけを返しますデータが挿入されました
  st.insert(); //データを挿入、
          //次のように使用できます:st.insert(map <int、string> :: value_type(1、 "student_one"));
  これらのみがより便利です。
  次に、私が言いたいのは、すべてのデータをトラバースするときは、次のようなイテレータを定義する必要があるということです   。map <int、string> :: iterator iter; iterはイテレータです。
  例:
for(iter = st.begin( ); iter!= st.end(); iter ++)
  {        Cout << iter-> first << "" << iter-> second << end;   }   マップ自体にも赤と黒の木があります。次に、データ自体は挿入後の最初のキーワードで並べ替えられ(デフォルトは小さいものから大きいものへ)、最初から最後までトラバースすると、データは順番になります。


  2番目は文字列です。文字列は非常に強力です。使用するメンバー関数は次のとおりです。
  たとえば、define string st;
  st.length(); //文字列の長さを返します;
  st.empty(); //空かどうかを判断します;
  st。 clear()// clear st;
  st.resize(int len、char c); //文字列の現在のサイズをlenに設定し、不十分な部分を文字cで
  埋めますst.size(); //サイズを返します文字列の;
  st.capacity()//現在の容量(つまり、メモリを増やさずに文字列に格納できる要素の数)を返します。

  以下はpoj1002です。waは見られないので1回です。重複する文字列がない場合は、出力:重複なし。; cinとcoutの速度が遅すぎるため、1回だけ解決します。醤油のマスターに最適化させます。入力と出力、そしてそれは終わりです。stlの使用速度はそれほど速くなく、時間とスペースの複雑さは十分に把握されていませんが、コードの量ははるかに少ないことがわかります。

  コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<map>
#include<string>
#include<iostream>
using namespace std;
#define maxn 100010

map <string,int>ss;
int d[30]={
         
         2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9},ans[maxn];
int n;

int main()
{
         
         
    int i,j,k;
    string st1,st2;
    map<string,int>::iterator iter;

    ios::sync_with_stdio(false);//输入优化,使用后,不能和scanf混合使用

    cin >> n;
    i=0;
    while(n--)
    {
         
         
        i++;
        cin>>st1;
        k=-1;
        st2.clear();
        st2.resize(8,'-');
        for(j=0;j<st1.length();j++)
            if(st1[j]>='A' && st1[j]<='Z')
            {
         
         
                k++;
                if(k==3) {
         
          st2[k]='-';  k++;  }
                st2[k]=d[st1[j]-'A']+'0';
            }
            else if(st1[j]>='0' && st1[j]<='9')
            {
         
         
                k++;
                if(k==3) {
         
          st2[k]='-';  k++; }
                st2[k]=st1[j];
            }
            else
            {
         
         
                continue;
            }
        iter = ss.find(st2);
        if(iter==ss.end())
        {
         
         
            ss[st2]=i;
            ans[i]=1;
        }
        else
        {
         
         
            i--;
            ans[iter->second]++;
        }
    }

    bool flag=0;
    for(iter=ss.begin();iter!=ss.end();iter++)
    {
         
         
        if(ans[iter->second]!=1)
        {
         
         
            flag=1;
            cout<<iter->first<<' '<<ans[iter->second]<<endl;
        }
    }
    if(!flag) cout << "No duplicates." << endl;    
    return 0;
}

おすすめ

転載: blog.csdn.net/zjsxzjb/article/details/6685186