简单的电话簿程序删除联系人

时间:2015-04-21 21:46:40

标签: c++ string vector

我正在制作一个使用文本文件的简单电话簿,因为我是初学者,这是家庭作业。我有查看联系人和添加功能正确。我唯一的问题是我无法弄清楚如何使用输入删除联系人。我正在使用矢量。我有一个类来声明我的变量和函数。以下是我到目前为止的情况:

我删除了其他功能,因为我只专注于删除联系人并减少混淆

#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>

class phonebook
{
public:
void deletecontact();


private://declaring the variables
vector<string> name;//Graves the contact and phone number
string NAME;
string delete_contact;//input to delete contact
bool flag = 0;

};

void phonebook::deletecontact()
{
ifstream fin;
ofstream fout;

fin.open("phonebook.txt");
fout.open("phonebook.txt", ofstream::out | ofstream::app);


if (fout.fail())
{
    cout << "Error";
    exit(1);
}

if (fin.fail())
{
    cout << "Error";
    exit(1);
}

   while (getline(fin, NAME)){
    name.push_back(NAME);

}


cout << "Type in who you want to delete" << endl;

cin >> delete_contact;
for (unsigned int i = 0; i < name.size(); i++)
    if (delete_contact==name[i])
    {
        system("cls");
        flag =1;
    }

    if(flag)
{
    for(unsigned int i=0; i<name.size(); i++)
        if(name[i].erase(delete_contact))
    {
        cout << "Deleted successfully!" << endl;
        fout << name[i];
    }
    }



fin.close();
fout.close();

system("PAUSE");

}

这是我的错误:

在成员函数'void phonebook :: deletecontact()'中:| 错误:没有匹配函数来调用'std :: basic_string :: erase(std :: string&amp;)'|

批评也会很酷

2 个答案:

答案 0 :(得分:1)

for (std::vector<string>::iterator itr = name.begin(); itr != name.end(); itr++) // Use iterators for looping
{
    if (delete_contact == *itr) // Get the correct iterator 
    {
        system("cls");
        flag = 1;
        break;
    }
}
if (flag)
{
    if (name[i].erase(itr)) // Erase for the correct iterator
    {
        cout << "Deleted successfully!" << endl;
        fout << name[i];
    }
}

这只是为了修补你拥有的东西。如果我是你,我会使用std::findstd::remove

答案 1 :(得分:1)

错误的原因是您尝试使用string::erase()的参数调用std::stringstd::string类中没有这样的功能。 name[i]std::string,因此您尝试在erase上致电std::string

您要做的是调用vector::erase,并为要删除的项目提供迭代器。为此,您可以使用vector::erasestd::remove

轻松删除名称
#include <algorithm>
//...
name.erase(std::remove(name.begin(), name.end(), delete_contact), name.end());

不需要flag变量,没有循环等。remove算法函数返回与名称匹配的项的迭代器。然后,这只是从这个迭代器开始擦除所有项目的问题。

注意:

如果您只想删除找到的第一个项目(而不是与delete_contact匹配的所有项目),请将std::remove替换为std::find