题解 | #简单错误记录#
简单错误记录
http://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
我也是参考别人的代码写的呜呜呜
其中顺便学习了仿函数,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;
}