Lee_Serena 2024-04-20 12:50 采纳率: 14.3%
浏览 4
已结题

C++ map实现基于家族姓氏的查询,输出成员的名字

#我的程序对第一个输入的家庭无法保存,查询也查不到

#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
typedef vector<string> vstring;
typedef map<string, vstring> mytype;

int main()
{
    do
    {
        string Family;
        string Name;
        vector<string> vname;
        cout << "输入家庭名称" << endl;
        cin >> Family;
        //map的find函数
        map<string, vector<string>> FamilyMap;
        mytype::iterator it = FamilyMap.find(Family);
        if (it != FamilyMap.end())
        {
            cout << "已存在的家庭名称:" << Family << endl;
            continue;
        }
        cout << "输入孩子的名字" << endl;
        while (cin >> Name)
        {
            vname.push_back(Name);
            cin.clear();
            if (cin.get() == '\n')
                break;
        }
        cin.clear();
        FamilyMap.insert(make_pair(Family, vname));
        cout << "是否继续添加 是【0】 否【1】" << endl;
        int choice;
        cin >> choice;
        if (choice == 0)continue;
    
            //查询
            cout << "请输入要查询的家庭:";
            cin >> Family;
            map<string, vstring>::iterator ret = FamilyMap.find(Family);
            if (ret != FamilyMap.end())
            {
                cout << "孩子有:" << endl;
                vector<string >::iterator ite = ret->second.begin();
                while (ite != ret->second.end())
                {
                    cout << *ite << endl;
                    ite++;
                }
            }
            else
                cout << "没有您要查询的家庭!" << endl;
    } while (cin);
        return 0;
}

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-20 12:50
    关注

    引自免费微信小程序:皆我百晓生

    在您的代码中,主要的问题在于每次循环开始时都重新创建了一个新的FamilyMap。这会导致在循环内部插入的数据在下一次循环迭代中丢失,因为新创建的FamilyMap并不会包含上一次循环中插入的信息。

    为了解决这个问题,您需要将FamilyMap变量移动到do-while循环外部,这样它就可以在整个程序运行期间保持其状态。以下是修改后的代码:

    #include<iostream>
    #include<vector>
    #include<string>
    #include<map>
    using namespace std;
    typedef vector<string> vstring;
    typedef map<string, vstring> mytype;
    
    int main()
    {
        mytype FamilyMap; // 将FamilyMap移到这里,让它在循环外
    
        do
        {
            string Family;
            string Name;
            vector<string> vname;
            cout << "输入家庭名称" << endl;
            cin >> Family;
    
            // 现在我们已经有了一个全局的FamilyMap,不需要再创建一个新的了
            // map的find函数
            mytype::iterator it = FamilyMap.find(Family);
    
            if (it != FamilyMap.end())
            {
                cout << "已存在的家庭名称:" << Family << endl;
                continue;
            }
    
            cout << "输入孩子的名字" << endl;
            while (cin >> Name)
            {
                vname.push_back(Name);
                cin.clear();
                if (cin.get() == '\n')
                    break;
            }
            cin.clear();
    
            FamilyMap.insert(make_pair(Family, vname)); // 使用全局的FamilyMap进行插入操作
    
            cout << "是否继续添加 是【0】 否【1】" << endl;
            int choice;
            cin >> choice;
            if (choice == 0) continue;
    
            // 查询
            cout << "请输入要查询的家庭:";
            cin >> Family;
            map<string, vstring>::iterator ret = FamilyMap.find(Family);
            if (ret != FamilyMap.end())
            {
                cout << "孩子有:" << endl;
                vector<string>::iterator ite = ret->second.begin();
                while (ite != ret->second.end())
                {
                    cout << *ite << endl;
                    ite++;
                }
            }
            else
                cout << "没有您要查询的家庭!" << endl;
        } while (cin);
    
        return 0;
    }
    

    现在这个程序应该可以正确地存储并查询多个家庭及其成员了。每次循环都会更新同一个FamilyMap,因此无论用户输入多少个家庭,它们都会被保存下来供后续查询。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月20日