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

最近做了一道华为的笔试题,没有涉及到什么算法,就是很多细节很烦,和涉及到很多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_pair
template <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::cout

int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值