问题描述:
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
思路:
首先将文件名称的路径去掉,然后用vector容器来存储由文件名和出现次数所组成的pair对组。
若文件名已出现在vector容器中,则直接更新该元素的出现次数;否则,将该文件名加入vector容器末尾;
最后自定义比较函数,比较用pair对组的第二个元素做比较,并采用稳定性排序(stable_sort)来将vector容器按文件出错次数排序。
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<string,int> new_pair;
bool cmp(new_pair t,new_pair p){
return t.second>p.second;
}
int main(){
string s;
vector<new_pair> hash;
while(getline(cin, s)){
int a = s.rfind('\\'), i=0;
if (a != -1){
s = s.substr(a+1);
}
int position = s.find(' ');
if (position>16){
s = s.substr(position-16);
}
int size = hash.size();
for(i=0;i<size;i++){
if(hash[i].first==s){
hash[i].second++;
break;
}
}
if (i==size){
hash.push_back(make_pair(s,1));
}
}
stable_sort(hash.begin(),hash.end(),cmp);
int size = hash.size(), i=0;
//cout<<size<<endl;
while(i<8 && i<size){
cout<<hash[i].first<<' '<<hash[i].second<<endl;
i++;
}
return 0;
}