C++ HashMap函数集输出不正确,未给出错误

cidc1ykv  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(139)

我将提供下面的所有代码,因为我无法找出错误在哪里。
我不明白为什么要为最终函数打印两次标题
任何帮助都非常感谢。我在网上看过的所有笔记和代码似乎都和我有相同的代码结构,所以我不明白为什么它不起作用。

#include <iostream>
#include <unordered_map>
#include <vector>
#include <iomanip>
#include <algorithm>

using namespace std;

int findDate (unordered_map <int, string> employeeInfo, string employeeName)
{
    int answer = -1;
        for(auto item:employeeInfo)
        {
            if(item.second==employeeName)
               answer=item.first;
        }
        return answer;
}

int totalSignedUp (unordered_map <int, string> employeeInfo)
{
    int count=0;
    for (auto item:employeeInfo)
        count=count+1;
    return count;
}

void printMonth (string title, unordered_map <int, string> employeeInfo)
{
    cout<<title<<"\n";
    printf("Date    Name of Employee\n");
    for(auto item: employeeInfo)
    {
        cout << item.first << "    " << item.second << endl;
    }
}

int main()
{    
        unordered_map <int, string> employeeInfo;
        employeeInfo[1]="Ben";
        employeeInfo[2]="Erica";
        cout<<findDate(employeeInfo, "Erica")<<"\n";
        cout<<totalSignedUp(employeeInfo)+"\n";
        printMonth("Volunteers", employeeInfo);
    
}

对不起张贴我的整个代码,但我不能查明问题出在哪里。

xxhby3vn

xxhby3vn1#

您的代码存在以下几个问题:
1.你传递的是std::unordered_map的值,这意味着函数正在处理Map的临时副本,临时副本在函数结束时被销毁,因此当函数返回时你不会看到任何变化。
1.您正在编写不需要编写的函数。一个明显的例子是您正在使用循环来查找std::unordered_map中的键值。这完全违背了unordered_map的用途,因为它是用于快速查找的。您应该使用unordered_map::find()方法来搜索键值。
1.您有可以编译的代码,但可能由于打字错误而明显错误。
下面是一个例子:
cout<<totalSignedUp(employeeInfo)+"\n";
显然,不必要的+不应该存在。
下面是代码的重写,解决了列出的问题:

#include <iostream>
#include <unordered_map>
#include <vector>
#include <iomanip>
#include <algorithm>
#include <string>

using EmployeeInfo = std::unordered_map<int, std::string>;

bool addEmployee(EmployeeInfo& employeeInfo, std::string employeeName, int date)
{
    auto pr = employeeInfo.insert({date, employeeName});
    return pr.second;
}

std::string findEmployee (EmployeeInfo& employeeInfo, int date)
{
    auto iter = employeeInfo.find(date);
    if ( iter != employeeInfo.end())
        return iter->second;
    return {};        
}

int findDate (EmployeeInfo& employeeInfo, std::string employeeName)
{
    auto iter = std::find_if(employeeInfo.begin(), employeeInfo.end(),
                            [&](auto& pr) { return pr.second == employeeName;});
    if ( iter != employeeInfo.end())
        return iter->first;
    return -1;
}

int totalSignedUp (EmployeeInfo& employeeInfo)
{
    return employeeInfo.size();
}

std::vector<std::string> employeesByDate (EmployeeInfo& employeeInfo, 
                                          int startDate, int endDate)
{
    std::vector <std::string> names;
    for ( auto& item : employeeInfo)
    {
        if (item.first >=startDate && item.first <= endDate)
            names.push_back(item.second);
    }
    return names;                 
}

std::vector<std::string> employees (EmployeeInfo& employeeInfo)
{
    std::vector<std::string> employees;
    for(auto& item : employeeInfo)
        employees.push_back(item.second);
    return employees;
    
}
void printMonth (std::string title, EmployeeInfo& employeeInfo)
{
    std::cout<<title<<"\n";
    std::cout << "Date    Name of Employee\n";
    for(auto& item: employeeInfo)
    {
        std::cout << item.first << "    " << item.second << std::endl;
    }
}

int main()
{    
    EmployeeInfo employeeInfo;
    employeeInfo[1]="Ben";
    employeeInfo[2]="Erica";
    std::cout << "Adding employee\n";
    std::cout << (addEmployee(employeeInfo,"Sierra", 13)?"Added OK":"Not Added") << "\n";
    std::cout << "\nFinding employee\n";
    std::cout << findEmployee(employeeInfo, 13) << "\n";
    std::cout << "\nFinding date of Erica\n";
    std::cout<< findDate(employeeInfo, "Erica")<<"\n";
    std::cout << "\nNumber of employees\n";
    std::cout << totalSignedUp(employeeInfo) << "\n";
    std::cout << "\nPrinting employees:\n";
    printMonth("Volunteers", employeeInfo);
}

输出:

Adding employee
Added OK

Finding employee
Sierra

Finding date of Erica
2

Number of employees
3

Printing employees:
Volunteers
Date    Name of Employee
13    Sierra
2    Erica
1    Ben

不是最漂亮的输出,但它似乎。
所做的更改基本上是上面概述的关于您正在犯的错误的内容。
1.注意,使用usingunordered_map提供别名,这使得编码更简单、更简洁。
1.注意使用unordered_map::find()搜索日期。
1.在addEmployee中,使用unordered_map::insert()。如果该项已经存在,则返回的std::pair具有将设置为falsesecond。这将替换将bool设置为false的整个逻辑。
1.当搜索名字时,因为名字不是键值,所以这里必须进行线性搜索,std::find_if用于线性搜索Map,返回的迭代器将指向找到的条目,如果没有找到,则指向employeeInfo.end()
其余的改动应该是不言自明的。

相关问题