【发布时间】:2019-02-08 06:09:29
【问题描述】:
我进行了长时间的调试(6 小时或更长时间)。我正在调试我的 A* 算法实现。
在检查了所有可能性之后,在添加日志记录、逐步调试等之后,我终于找到了答案。基本上,这一切都归结为一行,我在其中搜索向量中的最小值。
看看这个:
auto open_set = std::vector<std::shared_ptr<node>>{start_node};
std::shared_ptr<node> current;
while (!open_set.empty())
{
current = *std::min_element(open_set.begin(), open_set.end());
current = *std::min_element(open_set.begin(), open_set.end()); 行应该在向量中找到最低的node。这是我的node 实现:
class node
{
public:
node() : G(0), H(0) {}
node(const QPoint& p) : pos(p), G(0), H(0) {}
bool operator==(const node& o) const { return pos == o.pos;}
bool operator==(const QPoint& o) const { return pos == o; }
bool operator!=(const node& o) const { return pos != o.pos; }
bool operator<(const node& o) const { return G + H < o.G + o.H; }
QPoint pos;
std::shared_ptr<node> parent;
int G;
int H;
};
所以我有搜索min_element 所需的operator<。问题是,经过多次查看我的日志后,我发现我有一个 node,即 G = 8、H = 10 和节点 G = 10、H = 10。猜猜哪个被选为 min_element - > 第二个!我不知道为什么,我很生气,所以我写了一个简单的 lambda 来比较节点:
current = *std::min_element(open_set.begin(), open_set.end(),
[&] (const std::shared_ptr<node>& lhs, const std::shared_ptr<node>& rhs)
{
return lhs->G + lhs->H < rhs->G + rhs->H;
});
然后繁荣,这个:
改成这样:
很明显,您可以看到第一个是错误的。而且我检查了很多次,现在一直都很好用,所以问题确实出在这里。
所以我的问题是为什么当我使用std::min_element 时它不起作用。这是否与我拥有std::shared_ptr<node>s 的std::vector 而不仅仅是nodes 的事实有关?我必须在node 类中以不同的方式写operator< 吗?
【问题讨论】:
-
所以在这里为
node写operator<是没有意义的,对吧?我必须使用 lambda 或定义即my_smart_pointer: shared_ptr并在那里重载operator<? -
I have to use lambda或节点向量。or define i.e. my_smart_pointer: shared_ptr不完全确定这是什么意思。为std::shared_ptr<Node>编写一个比较器应该可以工作。 -
但是我会在
shared_ptr类之外编写它 - 编译器会找到它吗? -
好吧,我猜你需要传递一个函数/一个 lambda。
标签: c++ stl operator-overloading