- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个以一对为参数的std::priority_queue
。该对具有参数int和Coord
。 Coord
是一个结构,仅包含两个用于数组坐标的整数(x和y)。
我要对整个程序进行的操作是在数组网格上实现Dijkstra算法(而不是使用图形),这已经让我头疼,因为我不确定自己是否以正确的方式进行操作。至少我正在尝试和学习。但是无论如何,我现在遇到的问题是,当我编译时,我得到了错误
"C2678 binary'<' no operator found which takes a left-hand operand of type 'const Coord' (or there is no acceptable conversion)"
struct Coord
{
int x, y;
};
Coord
结构。然后是创建队列的函数:
void dijkstraFirstPhase(Coord start, Coord end, int(&aGrid)[HEIGHT][WIDTH], unordered_map<pair<int, int>, bool, pair_hash>& theMap)
{
//priority_queue< pair<int, pair<int, int>> > pq;
priority_queue<pair<int, Coord>> pq; //this is the line where the error comes from
//initializing the starting point
int distanceFromStart = 0;
aGrid[start.x][start.y] = distanceFromStart;
pq.push({ distanceFromStart, start });
while (!pq.empty())
{
Coord u = pq.top().second;
theMap[make_pair(u.x, u.y)] = true;
pq.pop();
writeDistances(u.x, u.y, aGrid, theMap, pq);
displayGrid(aGrid);
if (theMap[make_pair(end.x, end.y)] = true)
{
cout << "The end has been found" << endl;
cout << "Distance written into its cell: " << aGrid[end.x][end.y] << endl;
break;
}
}
}
Coord
。
最佳答案
对您来说,这似乎完全合乎逻辑,但是编译器不知道您对“priority”的概念性定义对于Coord
而言意味着什么顺序。存储在队列中的对象如下所示:
std::pair<int, Coord>
std::priority_queue
如何比较元素。
std::priority_queue
缺省将
std::less
用于项目比较器以确定顺序。正如您现在所发现的那样,该比较器所做的只是创建一个简单的
a < b
构造以比较对象的顺序而已,并且如果对象类(或其基类)提供了此功能,那就太好了;如果不是,则需要这样做。事实证明,
std::pair
does provide an operator <
基本上在
first
和
second
之间建立了严格的弱排序。对于两个对对象,它基本上是这样做的:
return lhs.first < rhs.first || (!(rhs.first < lhs.first) && lhs.second < rhs.second);
second
用法。这很重要,因为上面的
second
属于您的类型
Coord
,因此,
operator <
被应用于
Coord
,并且由于没有这样的运算符,所以编译器=不满意。
std::pair<int, std::pair<int,int>>
可以立即使用,因为如前所述,
std::pair
具有运算符<
overload, and in that case two different instantiations of
运算符<`。
operator
。基本上只有两种方法可以执行此操作:成员函数或自由函数均定义
operator <
的
Coord
重载。通常实现为成员函数,但也可能实现为自由函数,这从根本上提供了运算符
std::less
寻找。这是提供命令的最常见机制(并且imho最容易理解):
// member function
struct Coord
{
int x, y;
bool operator <(const Coord& rhs)
{
return x < rhs.x || (!(rhs.x < x) && y < rhs.y)
}
};
// free function
bool operator <(const Coord& lhs, const Coord& rhs)
{
return lhs.x < rhs.x || (!(rhs.x < lhs.x) && lhs.y < rhs.y)
}
std::less<>
使
operator <
对给定类型满意之外,许多容器,适配器和算法还允许您提供自己的自定义比较器类型。例如:
std::map
std::set
std::sort
std::priority_queue
operator <
类型的实例提供一个Type
(简单,前面显示的示例)。这允许继续使用默认的std::less
来执行您提供的operator <
的工作。 std::less
的替代代码。 std::less<Coord>
的模板特化(适度简单,但很少做,对初学者来说不太直观)。它将std::less
替换为通常在任何地方使用的特化名称。 Coord
而不是您的
std::pair<int, Coord>
,前面已经解释了
std::less
进行订购。您也可以提供自己的函子来完成相同的工作。
std::priority_queue
的第三个模板参数是用于提供此功能的参数:
struct CoordLess
{
bool operator()(Coord const& lhs, Coord const& rhs) const
{
return lhs.x < rhs.x || (!(rhs.x < lhs.x) && lhs.y < rhs.y)
}
};
std::priority_queue<Coord, std::vector<Coord>, CoordLess> myqueue;
std::set
对象的
Coord
std::set<Coord, CoordLess> myset;
vec
对象的 vector
Coord
进行排序:
std::sort(vec.begin(), vec.end(), CoordLess());
std::less
特化
std::less
是默认的比较器,因此,只要类型是自定义类型(不是本地语言类型或库类型),就可以为
std::less
提供
Coord
专门化。这意味着,如果事先提供了以下定义,则通常使用
std::less<Coord>
进行排序的所有内容都将隐式获得此信息。
namespace std
{
template<>
struct less<Coord>
{
bool operator ()(Coord const& lhs, Coord const& rhs) const
{
return lhs.x < rhs.x || (!(rhs.x < lhs.x) && lhs.y < rhs.y)
}
};
}
std::set
:
std::set<Coord> myset;
std::sort(vec.begin(), vec.end());
std::less<Coord>
,并且由于我们自己专门设计,因此使用了我们的。这是在许多地方更改默认行为的便捷,包围式方法,但是强大的功能带来了巨大的责任,因此请当心,切勿对本机或库提供的类型执行此操作。
关于c++ - 为什么为我的对象类编译标准优先级队列失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986376/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!