纤维Fibre 2023-02-22 18:03 采纳率: 63%
浏览 33
已结题

这个unordered_map错在哪里呢?

#第一次尝试哈希结构,写了一个代码,立刻就错了!
代码如下:

#include <iostream> 
#include <unordered_map> 

// Data Structure to store a Student Information
struct Student 
{ 
    int id; 
    const char* name; 
    Student(int Id, const char* Name) : id(Id), name(Name) {}
}; 

// Function to print the student details 
void print_student(Student s) 
{ 
    std::cout << "ID: " << s.id << ", Name: " << s.name << std::endl; 
} 

// Driver Code 
int main() 
{ 
    // Creating a unordered map with Student structure 
    // as key and marks as value 
    std::unordered_map<Student, int> studentMarksMap; 

    // Inserting values in studentMarksMap 
    studentMarksMap.insert({ { 1, "Martin" }, 84}); 
    studentMarksMap.insert({ { 2, "Andrew" }, 87}); 
    studentMarksMap.insert({ { 3, "John" }, 98}); 

    // Traversing an unordered map 
    for (auto itr = studentMarksMap.begin(); itr != studentMarksMap.end(); itr++) 
    { 
        print_student(itr->first); 
        std::cout << "\tMarks: " << itr->second << std::endl; 
    } 

    return 0; 
} 

报错信息:

img

  • 写回答

2条回答 默认 最新

  • 关注

    如楼上所说, C++无序容器对于非基本类型需要定义hash函数以及operator==, 补充一个方法, 对于不想用仿函数的可用lambda方法

    #include <iostream>
    #include <unordered_map>
    
    // Data Structure to store a Student Information
    struct Student
    {
        Student(int Id, const char *Name)
            : id(Id)
            , name(Name)
        {}
    
        // Function to print the student details
        void print_student() const
        {
            std::cout << "ID: " << id << ", Name: " << name << std::endl;
        }
    
        auto operator==(const Student &rhs) const -> bool
        {
            if (this != &rhs)
            {
                return id == rhs.id && (strcmp(name, rhs.name) == 0);
            }
            return true;
        }
    
        [[nodiscard]] auto getid() const -> int
        {
            return id;
        }
    
        [[nodiscard]] auto getname() const -> const char *
        {
            return name;
        }
    
      private:
        int id = 0;
        const char *name = nullptr;
        friend std::hash<Student>;
    };
    
    // namespace std
    //{
    // template <>
    // struct hash<Student>
    //{
    //     auto operator()(const Student &stu) const -> size_t
    //     {
    //         return std::hash<int>()(stu.id) ^
    //                std::hash<std::string>()(std::string(stu.name));
    //     }
    // };
    // } // namespace std
    
    // Driver Code
    int main()
    {
        auto hash = [](Student stu) -> size_t {
            return std::hash<int>()(stu.getid()) ^
                   std::hash<std::string>()(std::string(stu.getname()));
        };
        // Creating a unordered map with Student structure
        // as key and marks as value
        std::unordered_map<Student, int, decltype(hash)> studentMarksMap(10, hash);
    
        // Inserting values in studentMarksMap
        studentMarksMap.insert({{1, "Martin"}, 84});
        studentMarksMap.insert({{2, "Andrew"}, 87});
        studentMarksMap.insert({{3, "John"}, 98});
    
        // Traversing an unordered map
        for (auto &itr : studentMarksMap)
        {
            itr.first.print_student();
            std::cout << "\tMarks: " << itr.second << std::endl;
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 创建了问题 2月22日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分