3

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

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

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

4

1 回答 1

2

std::pair一个operator<按字典顺序排列其内容的也是如此。

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

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

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

在这两者之间,<onstd::pair< std::shared_ptr, std::shared_ptr >所做的是按第一个的对象标识,然后是第二个元素的pair. 对于图中的Nodes,这通常是您想要的。

如果您想按 的内容Node不是 的标识进行排序,则Node必须为您的std::map(或者,理论上,覆盖)提供一个比较函数operator<,但我不会在两层std结构上这样做在原始类型上)。

于 2013-09-08T13:23:11.297 回答