使用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();
}
京公网安备 11010502036488号