STL -- 关于一些字符串处理用到的函数和数据结构

来源:互联网 发布:linux dhcp 作用 编辑:程序博客网 时间:2024/06/05 04:40

最近做了一道华为的笔试题,没有涉及到什么算法,就是很多细节很烦,和涉及到很多STL的操作,很多都忘了,现在重拾~
题目:
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
输入
E:\V1R2\product\fpgadrive.c 1325
输出
fpgadrive.c 1325 1

#include<iostream>#include<string>#include<cstring> #include<vector>#include<algorithm>using namespace std;typedef pair<string, int> PAIR; //定义文件名行号 和 次数vector<PAIR> myvect;//用vector存储//自己定义比较函数,返回次数从大到小排序struct CmpByValue {    bool operator()(const PAIR& lhs, const PAIR& rhs) {      return lhs.second > rhs.second;    }  };  int main(){    string ss;    while(getline(cin,ss)){        if (ss.size() == 0) break;        int last = ss.size()-1;        int first;        for(int i = last;i>0;i--){            if(ss[i] == '\\'){                break;            }            else{                first = i;            }        }                string s = ss.substr(first,last);//截取文件名+行号,从字符串后面开始截取        //cout<<s<<endl;        vector<PAIR> ::iterator it;        bool isexist = false;        //插入到vector中        for(it = myvect.begin();it != myvect.end();++it){            if((*it).first == s){                (*it).second++;                isexist = true;                break;            }                   }        if(it == myvect.end() && !isexist){                myvect.push_back(make_pair(s,1));        }                }    //题目中要求是稳定的,所以这里用stable_sort    stable_sort(myvect.begin(),myvect.end(),CmpByValue());    vector<PAIR> ::iterator it;    //输出结果    int count = 8;//只输出8条记录    for(it = myvect.begin();it != myvect.end();++it){        if(count == 0) break;        //控制文件名最大为后16个字符        string ss = (*it).first;        int find = ss.find(' ');        int head,len;        if(find >= 16){            head = find - 16;            len = 16;        }else{            head = 0;            len = find;        }               string filename = ss.substr(head,len);        string times = ss.substr(find+1);        cout<<filename<<" "<<times<<" "<<(*it).second<<endl;        count--;    }}

这里涉及到几个string的函数

string substr(size_t pos = 0, size_t len = npos) const;
第一个参数是要截取的开始位置,第二个是要截取的长度(这个不要搞错了,不要以为是结束位置,一开始我以为是……)

    string ss;    cin>>ss;    cout<<ss.substr(0,ss.size()-1)<<endl;    cout<<ss.substr(0)<<endl;    cout<<ss.substr(3,5)<<endl;    /*输出为    01234567890    0123456789    01234567890    34567    */

关于find函数:

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;
这个函数就是找到参数1出现位置,第二个参数是控制在pos位置以及之后去找

关于pair

//pair模板的定义template <class T1, class T2> struct pair;//构造赋值函数make_pairtemplate <class T1,class T2>  pair<T1,T2> make_pair (T1 x, T2 y)  {    return ( pair<T1,T2>(x,y) );  } //访问成员 p.first; p.second;//example#include <utility>      // std::pair#include <iostream>     // std::coutint main () {  std::pair <int,int> foo;  std::pair <int,int> bar;  foo = std::make_pair (10,20);  bar = std::make_pair (10.5,'A'); // ok: implicit conversion from pair<double,char>  std::cout << "foo: " << foo.first << ", " << foo.second << '\n';  std::cout << "bar: " << bar.first << ", " << bar.second << '\n';  return 0;}

关于sort

stable_sort是保持稳定性的排序算法,在这道题里用的就是这个排序

template <class RandomAccessIterator, class Compare>  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
0 0