【发布时间】:2012-02-20 09:59:27
【问题描述】:
在 STL 容器中,例如 map 和 set - 如何确定用户定义类型的唯一键?
在 C# 中,这是通过覆盖 GetHashCode 和 Equals 方法来完成的。
【问题讨论】:
在 STL 容器中,例如 map 和 set - 如何确定用户定义类型的唯一键?
在 C# 中,这是通过覆盖 GetHashCode 和 Equals 方法来完成的。
【问题讨论】:
例如,地图采用 4 个参数作为其模板参数。大多数时候,开发人员只使用其中的两个,即Key 类型和Value 类型。但是,也可以提供一个仿函数来比较 Key 类型的对象(无论它是什么类型)。
来自 cplusplus.com:
Compare:比较类:接受两个键类型参数并返回一个布尔值的类。表达式 comp(a,b),其中 comp 是 此比较类的一个对象,a 和 b 是键值,应 如果 a 被放置在 a 中比 b 更早的位置,则返回 true 严格的弱排序操作。这可以是一个类 实现函数调用运算符或指向函数的指针(参见 构造函数为例)。这默认为 less,返回 与应用小于运算符相同(a
http://www.cplusplus.com/reference/stl/map/
几乎所有情况下都是如此(用于排序或任何其他容器时),并且这一原则适用于相当多的语言和平台。
【讨论】:
是最简单的情况,由Key1 < Key2确定。也就是说,通过一个适用的operator<。不需要Equals。如果(!(Key1 < Key2)) && (!(Key2 < Key1))(两个键都不是最小的),那么它们被认为是相等的。出于实际目的,这包含在 std::less<Key> 模板中。
如果您想要另一个订单,所有已订购的 STL 容器都采用 谓词。这是一个对象,它定义了一个 bool operator()(Key, Key) 成员来实现对键的严格弱排序。这意味着Pred(a,b) && Pred(b,c) 意味着Pred(a,c),Pred(a,a) 必须为假,Pred(a,b) && Pred(b,a) 也必须为假。换句话说,它必须是一个“正常”的排序。
【讨论】:
编辑:似乎我在这里谈论的东西略有不同,但我想我会留下它,因为它似乎是你在 C# 中谈论的内容。
你仍然需要实现你自己的 hash-function 和 eq-function,你只是做的不同。这样做有不同的方法,例如使用 operator() 定义一个类以返回某个值等,然后在定义地图时说map<YourClass, YourHashClass, YourEqClass, ...>
【讨论】:
首先,不清楚您需要什么容器。如果你谈论哈希,那么使用 std::unordered_map 并查看Defining a hash function in TR1 unordered_map inside a struct 如果你需要 map 或 set,你可以使用 operatorc++ less operator overload, which way to use?
设置顺序【讨论】: