题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
#include <algorithm>
#include <iostream>
#include <map>
#include <sstream>
#include <vector>
using namespace std;
struct key {
string filename;
int line;
key(string filename, int line) : filename(filename), line(line) {}
bool operator<(const struct key& g)const {
return (filename < g.filename) || (filename == g.filename && line < g.line);
}
};
// typedef struct key key;
using key = struct key;
int main() {
string input, filename;
int line;
map<key, int> mp;
vector<key> vk;
while (cin >> input >> line) {
istringstream iss(input);
size_t n_pos = input.find_last_of('\\'); //注意这个斜杠应该是双斜杠
if (n_pos == string::npos) cout << "error" << endl;
filename = input.substr(n_pos + 1, input.size() - n_pos); //文件名
if (filename.size() > 16) filename = filename.substr(filename.size() - 16, 16);
key k(filename, line);
if (mp.find(k) != mp.end()) { //如果找到了,引用计数加1
mp[k]++;
} else {
vk.push_back(k); //没找到则记录出现次数
mp[k] = 1;
}
// cout << line << endl;
}
if (vk.size() > 8) {
for (int i = vk.size() - 8; i < vk.size(); ++i) {
cout << vk[i].filename << " " << vk[i].line << " " << mp[vk[i]] << endl;
}
} else {
for (int i = 0; i < vk.size(); ++i) {
cout << vk[i].filename << " " << vk[i].line << " " << mp[vk[i]] << endl;
}
}
return 0;
}
// 64 位输出请用 printf("%lld")
主要是如何让map的键拥有两个值,定义了一个结构体,还要重载操作符
