使用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();
}