C ++从电子邮件向量中删除

时间:2016-12-20 02:12:34

标签: c++ email vector

我将电子邮件从文本文件加载到向量中,我想允许用户输入发件人的电子邮件,并在向量中找到并删除该对象, 但由于某种原因,我收到了错误。

这是函数

void deleteEmail(vector<Email> emailVector)
{
string junk;
getline(cin, junk);
cout << "Enter an email you want to delete" << endl;
string email_to_delete;
getline(cin, email_to_delete);
auto it = std::find(emailVector.begin(), emailVector.end(), email_to_delete);
if (it != emailVector.end())
    emailVector.erase(it);
for (Email e : emailVector)
    e.printEmail();
}

错误

Severity    Code    Description Project File    Line    Suppression State
Error   C2678   binary '==': no operator found which takes a left-hand operand of type 'Email' (or there is no acceptable conversion)   ProjectAlpha    c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 3258    

以下是电子邮件类

中的数据类型
class Email
{
private:
    string sender;
    string recipient;
    string time;
    string subject;
    string body;
    Attachment attachment;

1 个答案:

答案 0 :(得分:2)

您需要通过引用传递vector,而不是按值传递。否则,您正在操作原始矢量的副本,而不是原始矢量。

至于您的特定错误,您无法使用std::find()std::string个对象的向量中找到Email,因为您的Email类没有有一个operator==接受std::string作为输入。您可以将std::find_if()替换为谓词,例如:

void deleteEmail(vector<Email> &emailVector)
{
    cout << "Enter the sender email address you want to delete:" << endl;
    string email_to_delete;
    getline(cin, email_to_delete);
    auto it = std::find_if(emailVector.begin(), emailVector.end(),
        [](const Email &email) {
            // Email::sender is private, so you need
            // to provide public access to it...
            return (email.getSender() == email_to_delete);
        }
    );
    if (it != emailVector.end())
        emailVector.erase(it);
    for (Email &e : emailVector)
        e.printEmail();
}

如果您要从同一sender删除所有电子邮件,则可以改为使用std::remove_if(),例如:

void deleteAllEmail(vector<Email> &emailVector)
{
    cout << "Enter the sender email address you want to delete:" << endl;
    string email_to_delete;
    getline(cin, email_to_delete);
    auto it = std::remove_if(emailVector.begin(), emailVector.end(),
        [](const Email &email) {
            // Email::sender is private, so you need
            // to provide public access to it...
            return (email.getSender() == email_to_delete);
        }
    );
    emailVector.erase(it, emailVector.end());
    for (Email &e : emailVector)
        e.printEmail();
}