在STL容器中,如map
和set
- 如何为用户定义的类型确定唯一键?
在C#中,这是通过覆盖GetHashCode
和Equals
方法完成的。
答案 0 :(得分:2)
例如,地图将4个参数作为模板参数。大多数情况下,开发人员只使用其中的两个,即Key
类型和Value
类型。但是,也可以提供一个函数来比较Key
类型的对象(无论它是什么类型)。
来自cplusplus.com:
比较:比较类:一个接受键类型的两个参数并返回bool的类。表达式comp(a,b),其中comp为 这个比较类的对象和a和b是关键值 如果要将a放置在比b中的b更早的位置,则返回true 严格的弱订货操作。这可以是一个班级 实现函数调用操作符或指向函数的指针(参见 一个例子的构造函数)。默认为less,返回 与应用less-than运算符相同(a
http://www.cplusplus.com/reference/stl/map/
对于几乎所有情况(当用于排序或任何其他容器时)都是如此,并且这个原则适用于相当多的语言和平台。
答案 1 :(得分:2)
是最简单的情况,由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)
必须为false,Pred(a,b) && Pred(b,a)
也必须为false。换句话说,它必须是“正常”的排序。
答案 2 :(得分:0)
编辑:似乎我在谈论这里略有不同的东西,但我想我会离开它,因为它似乎就是你在C#中所说的。
你仍然需要实现自己的哈希函数和eq函数,你只需要采用不同的方法。有不同的方法,例如,一个用operator()定义一个类来返回一个特定值等,然后当你定义地图时,你说map<YourClass, YourHashClass, YourEqClass, ...>
答案 3 :(得分:0)
首先,目前还不清楚您需要哪些容器。如果你谈论哈希,那么使用std :: unordered_map并查看Defining a hash function in TR1 unordered_map inside a struct如果你需要map或set,你可以使用operator&lt;设置顺序。 c++ less operator overload, which way to use?