我正在尝试创建模板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;
}
但我很确定,这不会奏效。我应该创建比较类还是函数?它应该是模板吗?实际上,如何比较智能指针?
答案 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<
构造上这样做。)