【问题标题】:STL containers - How are unique key values determined?STL 容器 - 如何确定唯一键值?
【发布时间】:2012-02-20 09:59:27
【问题描述】:

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

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

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    例如,地图采用 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/

    几乎所有情况下都是如此(用于排序或任何其他容器时),并且这一原则适用于相当多的语言和平台。

    【讨论】:

      【解决方案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) 必须为假,Pred(a,b) && Pred(b,a) 也必须为假。换句话说,它必须是一个“正常”的排序。

      【讨论】:

        【解决方案3】:

        编辑:似乎我在这里谈论的东西略有不同,但我想我会留下它,因为它似乎是你在 C# 中谈论的内容。

        你仍然需要实现你自己的 hash-function 和 eq-function,你只是做的不同。这样做有不同的方法,例如使用 operator() 定义一个类以返回某个值等,然后在定义地图时说map<YourClass, YourHashClass, YourEqClass, ...>

        【讨论】:

        • std::map 和 std::set 不是散列容器。你所说的适用于 c++11 中的 std::unordered_map、std::unordered_set (和多个版本)。
        • 是的,看起来是这样。我想比较对于“常规”stl“地图”就足够了,我的错。
        • std::map 和 std::set 是有序的,所以简单的“相等”比较是行不通的。该标准要求“小于”比较。这可以是一个比较函子或函数,或者类型本身可以有一个运算符<.>
        【解决方案4】:

        首先,不清楚您需要什么容器。如果你谈论哈希,那么使用 std::unordered_map 并查看Defining a hash function in TR1 unordered_map inside a struct 如果你需要 map 或 set,你可以使用 operatorc++ less operator overload, which way to use?

        设置顺序

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-03
          • 2012-12-02
          • 2010-11-12
          • 1970-01-01
          • 2011-04-06
          • 1970-01-01
          • 1970-01-01
          • 2018-08-02
          相关资源
          最近更新 更多