我正在尝试创建一个模板图形类,因此我需要以某种方式存储边。我想,如果我可以通过两个 Node 智能指针访问 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
通过它存储的原始指针对自身(operator<
有时称为“排序”运算符)进行排序(从技术上讲,通过它存储的指针上的 std::less
,因为不能保证指针上的 <
表现良好,而std::less
保证表现良好)。
在这两者之间,什么<
在 std::pair< std::shared_ptr, std::shared_ptr >
确实是按第一个对象标识排序,然后是 pair
的第二个元素.其中,在 Node
的情况下图表中的 s,通常是您想要的。
如果您想按 Node
的内容 订购,而不是 Node
的身份 , 你必须为你的 std::map
提供比较功能(或者,理论上,重写 operator<
,但我不会在基于基本类型的双层 std
构造上这样做)。
关于c++ - 我应该为 map 中的两个智能指针对制作自己的比较器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18681838/