我正在将Java代码重写为C ++代码,并且在重复Java优先级队列时遇到了问题。
Java优先级队列的比较功能如下所示:
public int compareTo(Item that) {
if (this.dist < that.dist)
return -1;
if (this.dist > that.dist)
return 1;
return 0;
}
我在C ++中创建了一个比较函数,但它无法正常工作:
struct cmp
{
bool operator()(Item it1, Item it2)
{
if(it1.dist > it2.dist)
return true;
}
};
这是我的c ++代码优先级队列
我像这样调用优先级队列
priority_queue<Item, vector<Item>, cmp> que;
但是,Java的顺序和C ++的顺序不同......
请帮助我如果这还不够示例代码,我可以提供我的整个代码。 Java和C ++代码
答案 0 :(得分:1)
将比较运算符定义为
struct cmp
{
bool operator()(const Item & it1, const Item & it2) // pass by a const reference
{
return it1.dist > it2.dist;
}
};
您也可以将其定义为免费功能。
答案 1 :(得分:1)
struct cmp
{
bool operator()(Item it1, Item it2)
{
if(it1.dist > it2.dist)
return true;
}
};
理想情况下,if
检查应该相反:
if ( it1.dist < it2.dist)
由于priority_queue
需要的内容等同于std::less
。
此外,您只需return
:
bool operator()(Item it1, Item it2)
{
return it1.dist < it2.dist;
}
重要的是,Item
参数理想情况下必须是const
和参考:
bool operator()(const Item& it1, const Item& it2)
{
return it1.dist < it2.dist;
}
如果您使用的是C ++ 11或更高版本的编译器(我认为),您只需使用lambdas而不是struct
定义operator()
。见this answer
答案 2 :(得分:0)
似乎你没有设定一个条件来回复虚假&#39;在C ++ cmp中
struct cmp
{
bool operator()(Item it1, Item it2)
{
if(it1.dist > it2.dist)
return true;
else
return false
}
};
答案 3 :(得分:0)
您需要修复返回的值:
struct cmp
{
bool operator()(Item it1, Item it2)
{
return (it1.dist > it2.dist)
}
};