#include <iostream> #include<vector> #include<sstream> using namespace std; int main() { //可以考虑使用map容器,将文件名和行号作为key值,报错次数作为value值,每处理一个报错信息时判断map是否有相同key,有则value+1,没有则插入新值。最后需要输出最新的八条记录,因此我们最好在key中增加一个值用来代表插入时的序号,最后按照序号来输出最新的记录。但是这样会涉及到更复杂的字符串处理与大小比较。我们可以在value中加一个int存储插入时的序号,最后遍历容器map只输出其中序号最大的八条记录; //也可以考虑使用vector容器来存储,每一个元素包括了文件名和行数和报错次数,由于我们每处理一个报错信息就插入容器,因此每个元素的下标就代表插入的顺序,最后我们输出末尾的八条记录即可。如果有相同的报错信息(文件名和行号相同),只需要将报错次数加一即可。 //报错信息类 class err { public: string m_name;//文件名 string m_line;//错误行号 int m_count;//报错次数 }; vector<err> e_vec;//存放所有的错误信息 string error;//每次处理一行 while (getline(cin, error)) { stringstream ss(error); string tmp; while (getline(ss, tmp, '\\'));//读取到最后一段,包含文件名和次数 string filename = tmp.substr(0, tmp.find(' '));//文件名 string line = tmp.substr(tmp.find(' ') + 1);//行号 //cout<<filename<<endl<<num; if (filename.size() > 16) //取最后16个字符 filename = filename.substr(filename.size() - 16); //插入之前判断信息是否已经存在容器中 bool exist = false; for (auto& it : e_vec)//注意要用引用才能真实修改到容器中的数据 { if (it.m_name == filename && it.m_line == line) { it.m_count++; exist = true; break;//找到则退出 } } if (!exist)//不存在则插入容器 { err info;//插入新的报错信息 info.m_name = filename; info.m_line = line; info.m_count = 1; e_vec.push_back(info); } } //输出最后的八条记录 int size = e_vec.size(); for (int i = size>8 ? size-8 : 0 ; i < e_vec.size(); i++) { cout << e_vec[i].m_name << ' ' << e_vec[i].m_line << ' ' << e_vec[i].m_count << endl; } }