我正在制作一个使用文本文件的简单电话簿,因为我是初学者,这是家庭作业。我有查看联系人和添加功能正确。我唯一的问题是我无法弄清楚如何使用输入删除联系人。我正在使用矢量。我有一个类来声明我的变量和函数。以下是我到目前为止的情况:
我删除了其他功能,因为我只专注于删除联系人并减少混淆
#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;)'|
批评也会很酷
答案 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::find
和std::remove
。
答案 1 :(得分:1)
错误的原因是您尝试使用string::erase()
的参数调用std::string
。 std::string
类中没有这样的功能。 name[i]
是std::string
,因此您尝试在erase
上致电std::string
。
您要做的是调用vector::erase
,并为要删除的项目提供迭代器。为此,您可以使用vector::erase
和std::remove
#include <algorithm>
//...
name.erase(std::remove(name.begin(), name.end(), delete_contact), name.end());
不需要flag
变量,没有循环等。remove
算法函数返回与名称匹配的项的迭代器。然后,这只是从这个迭代器开始擦除所有项目的问题。
注意:
如果您只想删除找到的第一个项目(而不是与delete_contact
匹配的所有项目),请将std::remove
替换为std::find
。