我也是参考别人的代码写的呜呜呜

其中顺便学习了仿函数,typedef,构造函数,以及lambda表达式

基本思路就是先分解字符串,记录那个码

然后记录这个东西出现的次数,如果出现了就加1

反正vector是按照顺序插入的,输出记录的最后八个错误即可。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>

using namespace std;
//////////下面这里已经注释了
/*
struct error_codes{
    string filename;
    int codeline=0;
    int counter=1;
    bool operator==(const error_codes &a){    //这是仿函数
       if(a.filename==filename&&a.codeline==codeline)
        return true;
       else
        return false;
    }
};*/
////////////////////如果想用的话就吧main里面的代码find_if改为find(inputs.begin(), inputs.end(), temp);

struct error_codes{ // 定义错误码结构体
    string filename;
    int codeline=0;
    int counter=1;
};

string getfilename(string filename){ //提炼最后长度至多为16的字符串
    int n = filename.size()-1;
    int index;
    for(int i = n; i > 0; i--){
        if(filename[i] == '\\'){
            index = i;
            break;
        }
    }
    int len = n - index;
    if( len <= 16 )return filename.substr(index+1,len);
    else return filename.substr(n-15, 16);
}

int main(){
    vector<error_codes> inputs;
    string filename;
    int codeline;
    while(cin>>filename>>codeline){
        error_codes temp;//创建临时错误码变量
        temp.filename = getfilename(filename);
        temp.codeline = codeline;
        // 下面这个是find_if 是接受lambda表达式的,find()函数的话就没有这个功能
        //  具体的话自己查吧
        vector<error_codes>::iterator res = find_if(inputs.begin(), inputs.end(), [temp](const error_codes& a){
            if((a.filename == temp.filename)&&(a.codeline == temp.codeline))return true;
            else return false;
        });
        if(res == inputs.end()){//如果不存在就加进去
            inputs.emplace_back(temp);
        }
        else{//否则加1
            (*res).counter++;
        }
    }
    int j = 0;
    if(inputs.size() > 8)
        j=inputs.size() - 8;
    
    while(j < inputs.size()){//输出
        cout<<inputs[j].filename<<' '<<inputs[j].codeline<<' '<<inputs[j].counter<<endl;
        j++;
    }
    return 0;
}