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

如何使用用户定义类型作为 C std::maps 中的键?

Patricia Arquette
发布: 2024-12-24 13:49:14
原创
736 人浏览过

How Can I Use User-Defined Types as Keys in C   std::maps?

用户定义类型作为 std::maps 中的键

问题:使用具有用户定义类型的映射时出现隐秘编译器错误

在 C 中在编程中,将 STL 映射与用户定义的类一起使用常常会遇到神秘的编译器错误。具体来说,错误消息“与‘operator<’不匹配” in '__x < __y'”在尝试使用用户定义类型的键访问元素时很常见。

理解错误

错误消息表明编译器无法找到运算符 <用于比较用户定义类型的两个实例。这是因为,默认情况下,STL 映射需要比较运算符(运算符<)来对它们的键进行排序。但是,当使用用户定义类型时,此运算符不会自动可用。

解决方案 1:比较器函数对象

而不是定义运算符

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

std::map<Class1, int, Class1Compare> c2int;对于用户定义的类型,可以创建一个比较器函数对象类。此类实现了operator()的专门版本,用于确定用户定义类型的相对顺序。然后可以专门使用此比较器来映射映射:</p>
<h3></h3>
<p>解决方案 2:专门化 std::less</p>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
       bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
           return lhs.id < rhs.id;
       }
    };
}
登录后复制
另一种选择是专门为用户定义的 std::less 模板类型。这为 std::less 类中的 operator() 提供了自定义定义:

这种方法允许映射默认为 std::less 进行比较,同时为用户提供特定的实现 -定义类型。

结论

使用 STL 映射和用户定义类型时,必须提供一种比较键的方法。这可以通过比较器函数对象或专门化 std::less 来实现。通过满足这一要求,开发人员可以有效地利用以用户定义类型作为键的映射。

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板