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

时间:2013-09-08 08:23:45

标签: c++ templates map compare smart-pointers

我正在尝试创建模板Graph Class,所以我需要以某种方式存储Edges。我想,如果我可以通过两个Node智能指针访问EdgeValue,那可能会很棒。但我实际上并不知道,如何让它发挥作用。现在它是这样的:

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

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

1 个答案:

答案 0 :(得分:2)

因此std::pair有一个operator<,可以通过词汇表对其内容进行排序。

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

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

std::shared_ptr命令本身(operator<有时被称为“排序”运算符)由它存储的原始指针(技术上由std::less存储在它存储的指针上,因为{{1}指针不能保证表现良好,而<保证表现良好。)

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

如果您想按Node内容订购,而不是Node身份,则必须为你的Node提供一个比较函数(或者,理论上,覆盖std::map,但我不会在原始类型的两层operator<构造上这样做。)