使用list来保存插入顺序,使用unordered_map来保存出现的次数。最后通过遍历list来查询输出,输出时注意题目的要求是只输出文件后最后16位有效字符。在输入的时候,逐个读入字符拼接成字符串,如果遇到\n则代表出现一个新的错误日志。
#include <iostream> #include <list> #include <unordered_map> using namespace std; class caches { public: caches(int size) { m_max_size = size; } void insert(const string& key); void output(); private: list<string> m_list; unordered_map<string, int> m_map; int m_max_size; }; void caches::insert(const string& key) { unordered_map<string, int>::iterator iter = m_map.find(key); if(iter!=m_map.end()) { iter->second++; } else { //如果缓存已经满了则先删除一个; if(m_list.size() == m_max_size) { m_list.erase(m_list.begin()); } m_list.insert(m_list.end(),key); m_map.insert(make_pair(key,1)); } } void caches::output() { for(auto& l: m_list) { size_t offset = l.rfind(' '); string fname = l.substr(0,offset); string line_num = l.substr(offset+1); string tmp; if(fname.length()>16) { tmp = fname.substr(fname.length()-16,16); } else { tmp = fname; } cout << tmp << " " << line_num << " " << m_map.find(l)->second << endl; } } int main() { string str; caches cache(8); char ch; while(scanf("%c",&ch)!=EOF) { if(ch=='\n') { size_t offset = str.rfind('\\'); string tmp = str.substr(offset+1); cache.insert(tmp); str=""; } else { str += ch; } } cache.output(); }