STL map 和 string

转载自: http://hi.baidu.com/blackstar08/blog/item/a385507619bd9a15b051b9ac.html

  一直对stl不熟悉,但是发现在处理一些字符串问题的时候,stl用起来还是相当顺手的,所以这两天果断的看了些stl的知识,现在小结一下。

  对于stl的map,首先引入的头文件是: #include <map>
  然后定义是(一般用法): map<int,string> st; 其中st是map这个容器的变量名;
  map的成员函数有:
  st.clear();  //将st置零
  st.empty();  //判断st是否为空
  st.erase()   //删除用,可以删除关键字,或者成片删除
          //比如st.erase(1); 删除关键字为1的,成功返回1,否则为0;
          //比如st.erase(st.begin(),st.end());删除了整个st,删除的是前闭后开的区间;
  st.find();   //用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,
          //它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于          //end函数返回的迭代器,比如st.find(1);就是可以查找st->first为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;
  }
  还有要说的就是map本身里面是一棵红黑树,那么数据插入后本身是按第一个关键字排序的(默认从小到大),那么我们从头到尾遍历时,那么数据是有序的。

  第二个就是string。string很强大,要用的成员函数有:
  比如定义 string st;
  st.length(); //返回string的长度;
  st.empty();   //判断是否为空;
  st.clear()    //清空st;
  st.resize(int len,char c); //把字符串当前大小置为len,并用字符c填充不足的部分
  st.size();  //返回字符串的大小;
  st.capacity() //返回当前容量(即string中不必增加内存即可存放的元素个数);

  下面就是poj1002,wa了一次就是因为没有看到,当没有重复的串时,要输出:No duplicates. ;还tle了一次,是因为cin,cout速度太慢,让酱油教主教了下输入输出优化,然后就过了。可以看到使用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