自定义用户定义类型作为 C 中的映射键
C 标准库中的映射为键值提供高效的查找和插入操作对。然而,当尝试使用用户定义的类作为映射键时,由于缺乏合适的比较函数,开发人员可能会遇到神秘的错误消息。
一个常见的错误消息是:“与‘operator<’不匹配”在“__x < __y”中。出现此错误的原因是映射需要比较器或比较运算符(例如运算符<)来确定键的顺序。
默认情况下,映射使用 std::less 比较器模板参数来定义键的顺序。如果键类型提供了operator<重载时, std::less 会将比较委托给它。然而,对于用户定义类型,重载运算符<并不总是合适的。
要解决这个问题,有几种方法:
比较器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,您可以避免暴露显式运算符
以上是如何使用自定义用户定义类型作为 C 映射中的键?的详细内容。更多信息请关注PHP中文网其他相关文章!