我应该为地图中的两个智能指针对制作自己的比较器吗?



我正在尝试创建一个模板图类,所以我需要以某种方式存储边缘。我想,如果我可以通过两个节点智能指针访问 EdgeValue,那可能会很棒。但我实际上不知道,它是如何工作的。现在是这样的:

template <class Node, class EdgeValue>
class Graph
{
 typedef std::shared_ptr < Node > NodePtr;
 std::map < std::pair < NodePtr, NodePtr > , EdgeValue> Edges;
}

但我很确定,这是行不通的。我应该创建比较类还是函数?它应该是模板吗?实际上,如何比较智能指针?

所以std::pair有一个按字典顺序对其内容进行排序的operator<

首先按第一个元素排序,除非第一个元素相等:如果是这样,它按第二个元素排序。

这有点像我们如何对两个字母的单词进行排序。 (std::tuple将其扩展到n长度的元素)。

std::shared_ptr通过它存储的原始指针(技术上通过std::less它存储的指针)对自身进行排序(operator<有时称为"排序"运算符,因为指针上的<不能保证表现良好,而std::less保证表现良好)。

在这两者之间,< std::pair< std::shared_ptr, std::shared_ptr >所做的是按pair的第一个元素的对象标识排序,然后是第二个元素。 在图形中Node的情况下,这通常是您想要的。

如果你想按Node的内容排序,而不是Node恒等式,你必须为你std::map提供一个比较函数(或者,理论上,覆盖operator<,但我不会在基元类型的两层std构造上这样做)。

相关内容

  • 没有找到相关文章

最新更新