【问题标题】:unordered_map priority_queue comparatorunordered_map priority_queue 比较器
【发布时间】:2018-12-17 10:35:52
【问题描述】:

我有一个由名字和年龄组成的结构。我想要的是有一个 unordered_map,它将一个字符串作为它的键,然后是一个 map 或一个 priority_queue,然后存储给定字符串的年龄: 我有一个包含姓名和年龄的结构。我想使用 unordered_map 将字符串名称作为键,priority_queue(最小堆)存储按年龄排序的猫。我在编写比较器时遇到问题。

有人可以帮我使用比较器吗(comp 下面)?

#include <iostream>
#include <unordered_map>
#include <queue>
using namespace std;

struct Cat{
    string name;
    int age;
    Cat(string nm, int a) : name(nm), age(a) {}
};

auto comp = [] (const Cat &a, const Cat &b) {
    return a.age > b.age;
};

int main()
{
    cout<<"Hello World";
    unordered_map<string, priority_queue<Cat,vector<Cat>, decltype(comp)> mp;
    Cat c = new Cat("Bobby", 1); 
    mp[c.name].push(c);
    return 0;
}

它现在正在工作。详情见下文。 :)

#include <iostream>
#include <unordered_map>
#include <queue>
using namespace std;

class Cat{
    public:
    string name;
    int age;
    Cat(string nm, int a) : name(nm), age(a) {}
};

//auto comp = [] (const Cat &a, const Cat &b) { return a.age > b.age; };

class comp

{public:
    bool operator() (Cat const &a, Cat const &b) { return a.age < b.age; }
};

int main()
{
    priority_queue<Cat,vector<Cat>,  comp> q ;
    unordered_map<string, priority_queue<Cat,vector<Cat>,   comp  > >mp  ;
    Cat c("Bobby", 1);
    Cat* pt = new Cat("Bobby", 3);
    Cat d("Bobby", 2); 
    mp[pt->name].push(*pt);
    mp[d.name].push(d);
    mp[c.name].push(c);
    while (!mp["Bobby"].empty()) {
        Cat t = mp["Bobby"].top();
        cout << "name = " << t.name << " age = " << t.age << endl;
        mp["Bobby"].pop();
    }
    
    
    return 0;
}

【问题讨论】:

  • 你能告诉我们你是如何定义comp的吗?
  • 您需要两个不同的比较器 - 一个用于优先级队列,另一个用于无序映射。
  • @Archinde 更新!
  • @1201ProgramAlarm unordered_map 是一个哈希图,对吧?如何添加不同的比较器?
  • name存储在Cat中是否与在map中用作key的string一样?

标签: c++ comparator priority-queue


【解决方案1】:

如果你仍然关心这个。我刚刚花了一些时间在这个上,当您在 lambda 比较上使用 auto 关键字时,它会将“比较”变量的类型推断为布尔值。相反,您希望将 lambda 声明为 function&lt;bool(int,int)&gt;,以便在 priority_queue 模板中传递的类型是函数类型(或可调用对象)而不是普通变量。

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多