我必须通过检查电子邮件的来源是否在黑名单中找到,或者是否在阻止的单词列表中找到电子邮件内容中的任何单词来编写过滤电子邮件的内容。
这是过滤电子邮件的功能。
void filterEmail(vector<email>& amis, vector<email>& corbeille,
vector<email>& rejete, vector<email>& emails,
vector<string> b, vector<string> w,
vector<string> spam)
{
bool isListed(email, vector<string>);
bool isSpam(email, vector<string>);
for(vector<email>::size_type i = 0; i < emails.size();)
{
if(isListed(emails[i], b))
{
corbeille.push_back(emails[i]);
emails.erase(emails.begin() + i);
}
else i++;
}
for(vector<email>::size_type i = 0; i < emails.size();)
{
if(isListed(emails[i], w))
{
amis.push_back(emails[i]);
emails.erase(emails.begin() + i);
}
else i++;
}
for(vector<email>::size_type i = 0; i < emails.size();)
{
if(isSpam(emails[i], spam))
{
cout << emails[i].source << " " << emails[i].content[0];
rejete.push_back(emails[i]);
emails.erase(emails.begin() + i);
}
else i++;
}
return;
}
我在内容中检查垃圾字的部分有一个非常奇怪的问题(第3个循环) 经过一些测试cout后,我意识到在第一次使用isSpam返回true后,电子邮件的内容会更改为首先返回true的行,并且所有下一封电子邮件都返回true。
bool isSpam(const email e, const vector<string> motsinterdis)
{
for(vector<string>::size_type i = 0; i < e.content.size(); ++i)
{
for(vector<string>::size_type j = 0; j < motsinterdis.size(); ++j)
{
if(string::npos != e.content[i].find(motsinterdis[j]))
{
cout << e.source << endl;
cout << motsinterdis[j] << " found in " << e.content[i] << endl;
return true;
}
}
}
return false;
}
我有一个Struct电子邮件,其中包含一个矢量内容。对不起那里的法语变量:P 希望我已经足够清楚, 非常感谢。