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

标签 c++ string vector

我正在使用文本文件制作一个简单的电话簿,因为我是初学者并且这是家庭作业。我有正确的查看联系人和添加功能。我唯一的问题是我无法弄清楚如何使用输入删除联系人。我正在使用 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&)'|

批评也爽

最佳答案

错误的原因是您尝试使用 std::string 参数调用 string::erase()std::string 类中没有这样的函数。 name[i] 是一个 std::string,因此您试图在 std::string 上调用 erase

您要做的是调用 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

关于c++ - 删除联系人的简单电话簿程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783730/

相关文章:

c++ - 在 C++ 中实现 "tail -f"

c++ - 如果获胜者的 boolean 值为真,如何结束游戏? C++

c++ - 为 Qt 项目树中的所有项目定义一个全局宏

string - (转义)字符串插值中的双引号(在 Swift 中)

c++ - 使用 boost asio 时如何获取 UDP 远程端点?

c - strtok 导致段错误

c++ - valgrind 未检测到的 malloc_consolidate (malloc.c) 中的段错误

r - 向量中的嵌套滚动总和

c++ - 使用vector引发 'std::out_of_range'错误实例后调用终止

r - 获取一定长度的连续整数的运行并从第一个值中采样