首页 >后端开发 >C++ >如何使用自定义用户定义类型作为 C 映射中的键?

如何使用自定义用户定义类型作为 C 映射中的键?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-29 05:16:15667浏览

How Can I Use Custom User-Defined Types as Keys in C   Maps?

自定义用户定义类型作为 C 中的映射键

C 标准库中的映射为键值提供高效的查找和插入操作对。然而,当尝试使用用户定义的类作为映射键时,由于缺乏合适的比较函数,开发人员可能会遇到神秘的错误消息。

一个常见的错误消息是:“与‘operator<’不匹配”在“__x < __y”中。出现此错误的原因是映射需要比较器或比较运算符(例如运算符<)来确定键的顺序。

默认情况下,映射使用 std::less 比较器模板参数来定义键的顺序。如果键类型提供了operator<重载时, std::less 会将比较委托给它。然而,对于用户定义类型,重载运算符<并不总是合适的。

要解决这个问题,有几种方法:

  1. 比较器Function Object:创建一个单独的类来实现特定于用户定义类型的比较。在提供的代码中,使用operator()函数定义了Class1Compare类,该函数根据id成员比较Class1实例。

    struct Class1Compare
    {
       bool operator() (const Class1& lhs, const Class1& rhs) const
       {
          return lhs.id < rhs.id;
       }
    };

    然后,在实例化映射时,将比较器函数对象指定为第三个模板参数:

    std::map<Class1, int, Class1Compare> c2int;</p>
    <li>
    <p><strong>模板特化std::less</strong>:另一种选择是为您的用户定义类型专门化 std::less 模板。这允许您直接在 std 命名空间内定义比较逻辑。</p>
    <pre class="brush:php;toolbar:false">namespace std
    {
       template<>
       struct less<Class1>
       {
          bool operator() (const Class1& lhs, const Class1& rhs) const
          {
             return lhs.id < rhs.id;
          }
       };
    }

    通过专门化 std::less,您可以避免暴露显式运算符

  2. 重载代码的其他部分,使比较逻辑更加封装。

    通过使用其中一种方法,您可以克服使用用户定义类型作为映射键和增益的限制C 标准库高效映射工具的优势。

    以上是如何使用自定义用户定义类型作为 C 映射中的键?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn