题解 | #简单错误记录#
简单错误记录
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的键拥有两个值,定义了一个结构体,还要重载操作符