我正在尝试创建一个模板图类,所以我需要以某种方式存储边缘。我想,如果我可以通过两个节点智能指针访问 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
构造上这样做)。