c++ - 我应该为 map 中的两个智能指针对制作自己的比较器吗?

标签 c++ templates map compare smart-pointers

我正在尝试创建一个模板图形类,因此我需要以某种方式存储边。我想,如果我可以通过两个 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/

相关文章:

c++ - 为什么 bf1 和 bf2 共享一个内存位置,而 bf3 和 bf4 有自己的内存位置?

c++ - 成员函数的模板特化

c++ - 创建一个方法来使用模板迭代自定义类的任何容器?

java - 在 Java 中,字典数据结构最推荐的类是什么?

c++ - 如何使用重载运算符 [] 为左侧赋值?

c++ - 如何调整 CListCtrl 列的宽度以适应每列中最长的字符串?

c++ - 为什么会出现段错误?

c++ - 判断一个类型是否是类类型?

c++ push_back()在 vector 图中

c++ - STL map中的后序遍历