STL容器 - 如何确定唯一键值?

时间:2012-02-20 09:59:28

标签: c++ stl

在STL容器中,如mapset - 如何为用户定义的类型确定唯一键?

在C#中,这是通过覆盖GetHashCodeEquals方法完成的。

4 个答案:

答案 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?